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

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


精华贴数 1
个人空间 0
技术积分 640 (3343)
社区积分 18 (9020)
注册日期 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
技术积分 207428 (1)
社区积分 6461 (273)
注册日期 2001-10-8
论坛徽章:71
现任管理团队成员ITPUB元老ITPUB维基人参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章
生肖徽章2007版:龙生肖徽章2007版:蛇生肖徽章2007版:虎生肖徽章2007版:鼠生肖徽章2007版:猴生肖徽章:蛇

发表于 2004-7-5 14:13 


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

union要排序

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


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


精华贴数 65
个人空间 0
技术积分 207428 (1)
社区积分 6461 (273)
注册日期 2001-10-8
论坛徽章:71
现任管理团队成员ITPUB元老ITPUB维基人参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章
生肖徽章2007版:龙生肖徽章2007版:蛇生肖徽章2007版:虎生肖徽章2007版:鼠生肖徽章2007版:猴生肖徽章:蛇

发表于 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 (3343)
社区积分 18 (9020)
注册日期 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 (4823)
社区积分 295 (2190)
注册日期 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 (3343)
社区积分 18 (9020)
注册日期 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 (13758)
社区积分 3 (21700)
注册日期 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
技术积分 207428 (1)
社区积分 6461 (273)
注册日期 2001-10-8
论坛徽章:71
现任管理团队成员ITPUB元老ITPUB维基人参与2009年中国云计算大会纪念ITPUB北京2009年会纪念徽章八级虎吧徽章
生肖徽章2007版:龙生肖徽章2007版:蛇生肖徽章2007版:虎生肖徽章2007版:鼠生肖徽章2007版:猴生肖徽章:蛇

发表于 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 (2402)
社区积分 8 (13378)
注册日期 2003-4-25
论坛徽章:1
授权会员     
      

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


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



精华贴数 2
个人空间 0
技术积分 758 (2825)
社区积分 4 (18667)
注册日期 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号 联系我们 法律顾问