ITPUB??ì3
2010数据库技术大会
ITPUB论坛 » Oracle数据库管理 » 这样一条sql应该怎么优化?


您有 2 条公共消息
  • 来自: 公共消息 标题: ITPUB邮箱已经恢复 内容: ITPUB邮箱用户请注意,邮箱现在已经恢复 web访问地址 http://emai ...
  • 来自: 公共消息 标题: 3-5月ITPUB数据库 ... 内容: ITPUB与3月和5月分别安排了Oracle 11g DBA和Oracle性能优化培训,以及 ...

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


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

    发表于 2004-7-5 13:45 
    但看执行计划里面好像那个sort是sys_user和sys_grp做NESTED LOOPS时引起的吧


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


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

    发表于 2004-7-5 14:13 


    QUOTE:
    最初由 OL.O 发布
    是union需要SORT,它会用到temporary tablespace

    union要排序

    这里的union all是不需要排序的


    __________________
    只看该作者    顶部
    离线 eygle
    天下有雪


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

    发表于 2004-7-5 14:15 


    QUOTE:
    最初由 sanman 发布
    但看执行计划里面好像那个sort是sys_user和sys_grp做NESTED LOOPS时引起的吧

    排序来自于这一步:
    PHP code:


    6  5  SORT 
    (UNIQUE)

    7  6    TABLE ACCESS (BY INDEX ROWIDOF 'SYS_GRP'

    8  7       INDEX (RANGE SCANOF 'FK_SYS_USER_CODE' (NON-UNIQUE)

    在'SYS_GRP'表中,user_code 是非唯一键值
    在in值判断里,要做sort unique排序,去除重复值


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


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

    发表于 2004-7-5 14:38 
    我还是有个问题不大明白,为什么用原来的SQL是用sys_user来做驱动表,换了union后就用sys_grp做驱动了。


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


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

    发表于 2004-7-5 15:05 


    QUOTE:
    最初由 sanman 发布
    我还是有个问题不大明白,为什么用原来的SQL是用sys_user来做驱动表,换了union后就用sys_grp做驱动了。

    这个和union没什么关系的
    现在是把你以前的sql拆成了两句:
    select * from sys_user where user_code = 'zhangyong'

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

    现在是where user_code <> 'zhangyong'
    and user_code in (select grp_code from sys_grp where sys_grp.user_code = 'zhangyong')
    这样的条件,
    PHP code:


    4 1 NESTED LOOPS

    5 4 VIEW OF 
    'VW_NSO_1'

    6 5 SORT (UNIQUE)

    7 6 TABLE ACCESS (BY INDEX ROWIDOF 'SYS_GRP'

    8 7 INDEX (RANGE SCANOF 'FK_SYS_USER_CODE' (NON-UN

    IQUE
    )



    9 4 TABLE ACCESS (BY INDEX ROWIDOF 'SYS_USER'

    10 9 INDEX (UNIQUE SCANOF 'PK_SYS_USER' (UNIQUE)

    使用的这样的执行计划。


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


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

    发表于 2004-7-5 15:17 
    但原来的
    select * from exflow.sys_user where user_code = 'zhangyong' or user_code in
    (select grp_code from exflow.sys_grp where sys_grp.user_code = 'zhangyong');
    为什么不用sys_grp做驱动表?


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



    精华贴数 0
    个人空间 0
    技术积分 142 (14719)
    社区积分 4 (20616)
    注册日期 2001-11-1
    论坛徽章:0
          
          

    发表于 2004-7-5 15:19 
    :)

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


    只看该作者    顶部
    离线 eygle
    天下有雪


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

    发表于 2004-7-5 15:46 


    QUOTE:
    最初由 sanman 发布
    但原来的
    select * from exflow.sys_user where user_code = 'zhangyong' or user_code in
    (select grp_code from exflow.sys_grp where sys_grp.user_code = 'zhangyong');
    为什么不用sys_grp做驱动表?


    你仔细看过执行计划没有?

    最初的执行计划是 FILTER
    两个结果集FILTER
    这里已经没有严格意义上的驱动表了


    __________________
    只看该作者    顶部
    离线 OL.O
    老会员



    精华贴数 0
    个人空间 12
    技术积分 882 (2608)
    社区积分 8 (14713)
    注册日期 2003-4-25
    论坛徽章:1
    授权会员     
          

    发表于 2004-7-5 15:50 
    eygle分析的很透彻,真涨知识


    __________________
    正在学习,请多关照Win2000+ORACLE 8.1.6+"勤学好问"
    只看该作者    顶部
    离线 zjzcz
    江湖郎中



    精华贴数 2
    个人空间 0
    技术积分 758 (3046)
    社区积分 4 (20686)
    注册日期 2002-1-10
    论坛徽章:1
    授权会员     
          

    发表于 2004-7-26 16:56 
    select * from sys_user where user_code = 'zhangyong' or user_code in (select disttinct grp_code from sys_grp where sys_grp.user_code = 'zhangyong')

    这样试试


    __________________
    世上的很多事,你错过了一小时,很可能就错过一生了!
    只看该作者    顶部
    相关内容


    CopyRight 1999-2006 itpub.net All Right Reserved.
    北京皓辰网域网络信息技术有限公司. 版权所有
    E-mail:Webmaster@itpub.net
    网站律师 隐私政策 知识产权声明
    京ICP证:060528号 联系我们