ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle数据库管理 » 这样一条sql应该怎么优化?

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


精华贴数 1
个人空间 0
技术积分 640 (2970)
社区积分 18 (7971)
注册日期 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
技术积分 206744 (1)
社区积分 6444 (233)
注册日期 2001-10-8
论坛徽章:60
现任管理团队成员ITPUB长老会主席2007年度ITPUB杰出贡献ITPUB长老会成员ITPUB元老ITPUB维基人
授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:射击生肖徽章2007版:鼠2008年新春纪念徽章

发表于 2004-7-5 14:13 


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

union要排序

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


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


精华贴数 65
个人空间 0
技术积分 206744 (1)
社区积分 6444 (233)
注册日期 2001-10-8
论坛徽章:60
现任管理团队成员ITPUB长老会主席2007年度ITPUB杰出贡献ITPUB长老会成员ITPUB元老ITPUB维基人
授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:射击生肖徽章2007版:鼠2008年新春纪念徽章

发表于 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 (2970)
社区积分 18 (7971)
注册日期 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 (4316)
社区积分 301 (1890)
注册日期 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 (2970)
社区积分 18 (7971)
注册日期 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
技术积分 139 (12827)
社区积分 2 (22983)
注册日期 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
技术积分 206744 (1)
社区积分 6444 (233)
注册日期 2001-10-8
论坛徽章:60
现任管理团队成员ITPUB长老会主席2007年度ITPUB杰出贡献ITPUB长老会成员ITPUB元老ITPUB维基人
授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:射击生肖徽章2007版:鼠2008年新春纪念徽章

发表于 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
个人空间 0
技术积分 854 (2200)
社区积分 8 (11905)
注册日期 2003-4-25
论坛徽章:1
授权会员     
      

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


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



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