ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle数据库管理 » 这样一条sql应该怎么优化?

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


精华贴数 1
个人空间 0
技术积分 640 (3027)
社区积分 18 (8127)
注册日期 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
技术积分 1525 (1128)
社区积分 48 (5095)
注册日期 2004-7-4
论坛徽章:3
会员2007贡献徽章会员2006贡献徽章    
      

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


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


精华贴数 1
个人空间 0
技术积分 640 (3027)
社区积分 18 (8127)
注册日期 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 (3027)
社区积分 18 (8127)
注册日期 2003-11-18
论坛徽章:1
授权会员     
      

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


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


精华贴数 65
个人空间 0
技术积分 206875 (1)
社区积分 6449 (240)
注册日期 2001-10-8
论坛徽章:61
现任管理团队成员ITPUB长老会成员ITPUB元老Heart of PUBITPUB维基人ITPUB北京九华山庄2008年会纪念徽章
管理团队2006纪念徽章授权会员2008年新春纪念徽章生肖徽章2007版:龙生肖徽章2007版:猴ITPUB新首页上线纪念徽章

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

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


__________________
顶部
离线 sanman
中级会员


精华贴数 1
个人空间 0
技术积分 640 (3027)
社区积分 18 (8127)
注册日期 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 (4395)
社区积分 301 (1937)
注册日期 2004-7-1
论坛徽章:3
管理团队2006纪念徽章会员2006贡献徽章数据库板块每日发贴之星   
      

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


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


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

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


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


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

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

一定要用select * 吗?


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


精华贴数 65
个人空间 0
技术积分 206875 (1)
社区积分 6449 (240)
注册日期 2001-10-8
论坛徽章:61
现任管理团队成员ITPUB长老会成员ITPUB元老Heart of PUBITPUB维基人ITPUB北京九华山庄2008年会纪念徽章
管理团队2006纪念徽章授权会员2008年新春纪念徽章生肖徽章2007版:龙生肖徽章2007版:猴ITPUB新首页上线纪念徽章

发表于 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.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问