查看: 19144|回复: 14

关于oracle sql 语句中 where 子句条件的执行顺序

[复制链接]
论坛徽章:
0
发表于 2006-12-14 19:15 | 显示全部楼层 |阅读模式
小弟最近很郁闷,在搞一个oracle 的sql的优化,对oracle不太熟,遇到不少困难。
1:在where 子句中,当用不到索引时,各个条件按什么样的顺序执行?从上向下还是从下向上?我试过
where +  复杂计算的条件 +    能过滤掉大量纪录的条件

where +  能过滤掉大量纪录的条件 +   复杂计算的条件

我试了n次明显是前面一种比较慢,我在网上查了一下,有一篇文章被转帖的次数不计其数,上面说把能过滤掉大量纪录的条件放在后面是高效的,这不是扯蛋嘛?

2:当where 子句中能用上索引时,索引字段到底是放在前面还是后面?
因为oracle的优化器能自动找到索引,所以这个问题不大,但是相对之下哪种方式效率高一点?当为组合索引时该怎么写,如index_c(col1,col2,col3),
应该这样 where col1=?  and col2=? and col3=?  and  ........
还是这样 where ........ and col3=?  and col2=?  and col1=?

3:当多表关联的时候,表关联的条件是写在前面还是后面?我推测如果oracle是从前向后执行条件(索引除外),就应该把表关联的条件放在最后面,如果是从后向前执行,就应该把表关联的条件放在前面,不知道对不对,请高手指点。
论坛徽章:
9
茶鸡蛋
日期:2011-12-28 08:44:392012新春纪念徽章
日期:2012-01-04 11:49:54优秀写手
日期:2013-12-18 09:29:152014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
发表于 2006-12-14 19:19 | 显示全部楼层
WHERE子句中的条件顺序我一般不怎么关心,因为这事是由优化器来做了...

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2006-12-14 19:23 | 显示全部楼层
我在网上经常看到这个帖子:
WHERE子句中的连接顺序.     
        ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,   那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.     
  例如:     
  (低效,执行时间156.3秒)     
  SELECT   …     
  FROM   EMP   E     
  WHERE   SAL   >   50000     
  AND   JOB   =   ‘MANAGER’     
  AND   25   <   (SELECT   COUNT(*)   FROM   EMP     
                            WHERE   MGR=E.EMPNO);     
  (高效,执行时间10.6秒)     
  SELECT   …     
  FROM   EMP   E     
  WHERE   25   <   (SELECT   COUNT(*)   FROM   EMP     
                            WHERE   MGR=E.EMPNO)     
  AND   SAL   >   50000     
  AND   JOB   =   ‘MANAGER’;   


我觉得扯淡,我试了一下,在没有索引的条件下,明显是 where + 能过滤大量纪录的条件  +  复杂计算的条件   这样的顺序比较快。

使用道具 举报

回复
论坛徽章:
9
茶鸡蛋
日期:2011-12-28 08:44:392012新春纪念徽章
日期:2012-01-04 11:49:54优秀写手
日期:2013-12-18 09:29:152014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
发表于 2006-12-14 19:27 | 显示全部楼层
只在基于规则的优化器中有效 ...

使用道具 举报

回复
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB学员
日期:2010-07-12 15:33:58ITPUB学员
日期:2012-04-10 09:21:00
发表于 2008-11-12 20:07 | 显示全部楼层
这个文档我刚看了,有待做实验验证。期待有人先拿出实验证明  嘻嘻

使用道具 举报

回复
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB学员
日期:2010-07-12 15:33:58ITPUB学员
日期:2012-04-10 09:21:00
发表于 2008-11-12 20:08 | 显示全部楼层
我晕  这是个06年的老帖呀

使用道具 举报

回复
论坛徽章:
46
凯迪拉克
日期:2013-08-22 10:00:10Jeep
日期:2013-08-10 07:21:13ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:体操
日期:2008-10-24 13:08:31会员2007贡献徽章
日期:2007-09-26 18:42:10马上加薪
日期:2014-04-11 09:34:11秀才
日期:2015-09-06 10:19:32
发表于 2008-11-12 20:30 | 显示全部楼层
老翻新!

使用道具 举报

回复
论坛徽章:
13
铁扇公主
日期:2008-08-23 12:15:03奥运会纪念徽章:足球
日期:2008-08-28 20:19:082009日食纪念
日期:2009-07-22 09:30:002010年世界杯参赛球队:葡萄牙
日期:2010-03-11 08:38:072010年世界杯参赛球队:加纳
日期:2010-03-17 14:44:352012新春纪念徽章
日期:2012-01-04 11:53:29奥运会纪念徽章:拳击
日期:2012-06-18 16:33:22蛋疼蛋
日期:2013-04-03 16:41:24
发表于 2008-11-12 22:25 | 显示全部楼层
如今都是cbo时代了,这个都不用操心了,除了oracle犯迷糊的时候

使用道具 举报

回复
论坛徽章:
1
数据库板块每日发贴之星
日期:2008-10-28 01:01:04
发表于 2008-11-13 18:08 | 显示全部楼层
我测试过,这条快:where +  能过滤掉大量纪录的条件 +   复杂计算的条件

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2008-11-13 18:18 | 显示全部楼层
直接看计划,记这些东西不记死啊,而且老的和新的还是有很大区别的

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表