ITPUB论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
更多
楼主: sanman

[精华] 这样一条sql应该怎么优化? [复制链接]

注册会员

中级会员

精华贴数
1
技术积分
644
社区积分
32
注册时间
2003-11-18
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
发表于 2004-7-5 13:45:47 |显示全部楼层
但看执行计划里面好像那个sort是sys_user和sys_grp做NESTED LOOPS时引起的吧

使用道具 举报

超级版主

天下有雪

精华贴数
66
技术积分
208411
社区积分
6479
注册时间
2001-10-8
论坛徽章:
100
ITPUB元老
日期:2005-02-28 12:57:00ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36现任管理团队成员
日期:2011-05-07 01:45:08ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52ITPUB技术丛书作者
日期:2010-09-26 15:00:232010系统架构师大会纪念
日期:2010-09-03 16:39:572010数据库技术大会纪念徽章
日期:2010-05-13 10:04:282009架构师大会纪念徽章
日期:2010-01-18 13:43:21祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:212009日食纪念
日期:2009-07-22 09:30:00参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28
发表于 2004-7-5 14:13:20 |显示全部楼层
最初由 OL.O 发布
[B]是union需要SORT,它会用到temporary tablespace [/B]


union要排序

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

使用道具 举报

超级版主

天下有雪

精华贴数
66
技术积分
208411
社区积分
6479
注册时间
2001-10-8
论坛徽章:
100
ITPUB元老
日期:2005-02-28 12:57:00ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36现任管理团队成员
日期:2011-05-07 01:45:08ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52ITPUB技术丛书作者
日期:2010-09-26 15:00:232010系统架构师大会纪念
日期:2010-09-03 16:39:572010数据库技术大会纪念徽章
日期:2010-05-13 10:04:282009架构师大会纪念徽章
日期:2010-01-18 13:43:21祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:212009日食纪念
日期:2009-07-22 09:30:00参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28
发表于 2004-7-5 14:15:41 |显示全部楼层
最初由 sanman 发布
[B]但看执行计划里面好像那个sort是sys_user和sys_grp做NESTED LOOPS时引起的吧 [/B]


排序来自于这一步:

[php]

6  5  SORT (UNIQUE)
7  6    TABLE ACCESS (BY INDEX ROWID) OF 'SYS_GRP'
8  7       INDEX (RANGE SCAN) OF 'FK_SYS_USER_CODE' (NON-UNIQUE)

[/php]

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

使用道具 举报

注册会员

中级会员

精华贴数
1
技术积分
644
社区积分
32
注册时间
2003-11-18
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
发表于 2004-7-5 14:38:45 |显示全部楼层
我还是有个问题不大明白,为什么用原来的SQL是用sys_user来做驱动表,换了union后就用sys_grp做驱动了。

使用道具 举报

注册会员

斑竹

精华贴数
0
技术积分
450
社区积分
295
注册时间
2004-7-1
论坛徽章:
3
数据库板块每日发贴之星
日期:2005-10-19 01:01:30管理团队2006纪念徽章
日期:2006-04-16 22:44:45会员2006贡献徽章
日期:2006-04-17 13:46:34
发表于 2004-7-5 15:05:20 |显示全部楼层
最初由 sanman 发布
[B]我还是有个问题不大明白,为什么用原来的SQL是用sys_user来做驱动表,换了union后就用sys_grp做驱动了。 [/B]

这个和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]
4 1 NESTED LOOPS
5 4 VIEW OF 'VW_NSO_1'
6 5 SORT (UNIQUE)
7 6 TABLE ACCESS (BY INDEX ROWID) OF 'SYS_GRP'
8 7 INDEX (RANGE SCAN) OF 'FK_SYS_USER_CODE' (NON-UN
IQUE)

9 4 TABLE ACCESS (BY INDEX ROWID) OF 'SYS_USER'
10 9 INDEX (UNIQUE SCAN) OF 'PK_SYS_USER' (UNIQUE)
[/php]
使用的这样的执行计划。

使用道具 举报

注册会员

中级会员

精华贴数
1
技术积分
644
社区积分
32
注册时间
2003-11-18
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
发表于 2004-7-5 15:17:04 |显示全部楼层
但原来的
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做驱动表?

使用道具 举报

注册会员

一般会员

精华贴数
0
技术积分
142
社区积分
4
注册时间
2001-11-1
论坛徽章:
0
发表于 2004-7-5 15:19:03 |显示全部楼层

:)

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)

使用道具 举报

超级版主

天下有雪

精华贴数
66
技术积分
208411
社区积分
6479
注册时间
2001-10-8
论坛徽章:
100
ITPUB元老
日期:2005-02-28 12:57:00ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36现任管理团队成员
日期:2011-05-07 01:45:08ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52ITPUB技术丛书作者
日期:2010-09-26 15:00:232010系统架构师大会纪念
日期:2010-09-03 16:39:572010数据库技术大会纪念徽章
日期:2010-05-13 10:04:282009架构师大会纪念徽章
日期:2010-01-18 13:43:21祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:212009日食纪念
日期:2009-07-22 09:30:00参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28
发表于 2004-7-5 15:46:06 |显示全部楼层
最初由 sanman 发布
[B]但原来的
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做驱动表? [/B]


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

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

使用道具 举报

注册会员

老会员

精华贴数
0
技术积分
882
社区积分
8
注册时间
2003-4-25
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
发表于 2004-7-5 15:50:28 |显示全部楼层
eygle分析的很透彻,真涨知识

使用道具 举报

注册会员

江湖郎中

精华贴数
2
技术积分
758
社区积分
4
注册时间
2002-1-10
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
发表于 2004-7-26 16:56:51 |显示全部楼层
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')

这样试试

使用道具 举报

相关内容推荐
您需要登录后才可以回帖 登录 | 注册

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 邮箱 虎吧 老博客 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
回顶部