ITPUB??ì3
订阅ITPUB精粹播报,社区精彩内容不错过
ITPUB论坛 » Oracle数据库管理 » 这样一条sql应该怎么优化?


您有 1 条公共消息
  • 来自: 公共消息 标题: ITPUB国庆假期数 ... 内容: 全新编排的Oracle数据库课程,第一线数据库工程师传授亲身经验,完全摆 ...

    标题: [精华] 这样一条sql应该怎么优化?
    离线 sanman
    中级会员


    精华贴数 1
    个人空间 0
    技术积分 640 (3730)
    社区积分 18 (10284)
    注册日期 2003-11-18
    论坛徽章:1
    授权会员     
          

    发表于 2004-7-4 22:02 
    这样一条sql应该怎么优化?

    select * from sys_user where user_code = 'zhangyong' or user_code in (select grp_code from sys_grp where sys_grp.user_code = 'zhangyong')

    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=RULE
       1    0   FILTER
       2    1     TABLE ACCESS (FULL) OF 'SYS_USER'
       3    1     INDEX (UNIQUE SCAN) OF 'PK_SYS_GRP' (UNIQUE)

    里面的查询返回的记录数一般只有一两条,但sys_user表的数据很多,怎么样才能让这条sql以sys_grp为驱动表?

    谢谢!


    __________________
    step by stepQQ : 46387662Email : sam.von.cn@tom.com
    只看该作者    顶部
    离线 swordsky
    资深会员



    精华贴数 0
    个人空间 0
    技术积分 1523 (1460)
    社区积分 48 (6480)
    注册日期 2004-7-4
    论坛徽章:3
    会员2007贡献徽章会员2006贡献徽章    
          

    发表于 2004-7-4 22:45 
    虽然子查询里面返回的纪录数很少,但你用的是or,,
    只是单纯以sys_grp为`驱动表意义也不大。
    最好把你这俩个表的定义,数据分布给列给大家看看,
    这样更有助于对这个SQL进行优化。


    __________________
    技术不是秘密,秘密在于如何善用技术!
    只看该作者    顶部
    离线 sanman
    中级会员


    精华贴数 1
    个人空间 0
    技术积分 640 (3730)
    社区积分 18 (10284)
    注册日期 2003-11-18
    论坛徽章:1
    授权会员     
          

    发表于 2004-7-5 09:34 
    SQL> select count(distinct user_code) from sys_grp;

    COUNT(DISTINCTUSER_CODE)
    ------------------------
                        14580

    SQL> select count(distinct grp_code) from sys_grp;

    COUNT(DISTINCTGRP_CODE)
    -----------------------
                         300

    SQL> select count(distinct user_code) from sys_user;

    COUNT(DISTINCTUSER_CODE)
    ------------------------
                        15190

    为什么说有or 的时候用sys_grp为驱动表意义也不大?


    __________________
    step by stepQQ : 46387662Email : sam.von.cn@tom.com
    只看该作者    顶部
    离线 sanman
    中级会员


    精华贴数 1
    个人空间 0
    技术积分 640 (3730)
    社区积分 18 (10284)
    注册日期 2003-11-18
    论坛徽章:1
    授权会员     
          

    发表于 2004-7-5 10:39 
    up啊


    __________________
    step by stepQQ : 46387662Email : sam.von.cn@tom.com
    只看该作者    顶部
    离线 eygle
    天下有雪


    精华贴数 66
    个人空间 0
    技术积分 208184 (2)
    社区积分 6464 (332)
    注册日期 2001-10-8
    论坛徽章:85
    现任管理团队成员2007年度ITPUB杰出贡献年度精华徽章ITPUB元老ITPUB维基人2010数据库技术大会纪念徽章
    2009架构师大会纪念徽章参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章2010新春纪念徽章2010年世界杯参赛球队:希腊

    发表于 2004-7-5 11:21 
    索引情况如何?

    user_code 上有索引么?
    sys_grp有多少记录?


    __________________
    只看该作者    顶部
    离线 sanman
    中级会员


    精华贴数 1
    个人空间 0
    技术积分 640 (3730)
    社区积分 18 (10284)
    注册日期 2003-11-18
    论坛徽章:1
    授权会员     
          

    发表于 2004-7-5 12:07 
    SQL> select count(*) from sys_grp;

      COUNT(*)
    ----------
          25130

    SQL> select count(*) from sys_user;

      COUNT(*)
    ----------
          15190


    两个表的user_code都建了index


    __________________
    step by stepQQ : 46387662Email : sam.von.cn@tom.com
    只看该作者    顶部
    离线 糖醋兔子
    斑竹


    精华贴数 0
    个人空间 0
    技术积分 450 (5367)
    社区积分 295 (2495)
    注册日期 2004-7-1
    论坛徽章:3
    管理团队2006纪念徽章会员2006贡献徽章数据库板块每日发贴之星   
          

    发表于 2004-7-5 12:19 
    你分析过table,index和column了吗?


    __________________
    那都是很好很好的 可是我偏不喜欢
    只看该作者    顶部
    离线 sanman
    中级会员


    精华贴数 1
    个人空间 0
    技术积分 640 (3730)
    社区积分 18 (10284)
    注册日期 2003-11-18
    论坛徽章:1
    授权会员     
          

    发表于 2004-7-5 12:21 
    我们那里用RBO


    __________________
    step by stepQQ : 46387662Email : sam.von.cn@tom.com
    只看该作者    顶部
    离线 糖醋兔子
    斑竹


    精华贴数 0
    个人空间 0
    技术积分 450 (5367)
    社区积分 295 (2495)
    注册日期 2004-7-1
    论坛徽章:3
    管理团队2006纪念徽章会员2006贡献徽章数据库板块每日发贴之星   
          

    发表于 2004-7-5 12:24 
    select * from sys_user

    一定要用select * 吗?


    __________________
    那都是很好很好的 可是我偏不喜欢
    只看该作者    顶部
    离线 eygle
    天下有雪


    精华贴数 66
    个人空间 0
    技术积分 208184 (2)
    社区积分 6464 (332)
    注册日期 2001-10-8
    论坛徽章:85
    现任管理团队成员2007年度ITPUB杰出贡献年度精华徽章ITPUB元老ITPUB维基人2010数据库技术大会纪念徽章
    2009架构师大会纪念徽章参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章2010新春纪念徽章2010年世界杯参赛球队:希腊

    发表于 2004-7-5 12:27 
    试一下把or展开

    select * from sys_user where user_code = 'zhangyong'
    union all
    select * from sys_user where user_code <> 'zhangyong'
    and user_code in (select grp_code from sys_grp where sys_grp.user_code = 'zhangyong')


    __________________
    只看该作者    顶部
    相关内容


    CopyRight 1999-2006 itpub.net All Right Reserved.
    北京皓辰网域网络信息技术有限公司. 版权所有
    网站律师 隐私政策 知识产权声明
    广播电视节目制作经营许可证:编号(京)字第1149号
    京ICP证:060528号 联系我们

    北京市公安局海淀分局网监中心备案编号:1101082001