Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2898075
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2013-01-10 16:26:51

今天在ITPUB看到一个帖子,关于WHERE条件的执行顺序的。

http://www.itpub.net/thread-1755665-1-1.html

原文如下:

今天看到以下一句话,我记得以下的描述应该是针对RBO的吧,现在CBO优化器应该能自己判断了吧?
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,
那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

事实正好相反,可以过滤掉最大数量记录的条件必须写在WHERE子句的前面。

看下面一个经典例子:

SQL> desc x
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 X                                                  CHAR(1)
 Y                                                  CHAR(1)

SQL> select * from x;

X Y
- -
a 1
b 2
1 3
2 4

SQL> select * from x where x=1 and y=3;
select * from x where x=1 and y=3
                      *
第 1 行出现错误:
ORA-01722: 无效数字


SQL> select * from x where y=3 and x=1;

X Y
- -
1 3

SQL> set autot traceonly exp
SQL> select * from x where x=1 and y=3;

执行计划
----------------------------------------------------------
Plan hash value: 2941724873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     6 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| X    |     1 |     6 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(TO_NUMBER("X")=1 AND TO_NUMBER("Y")=3)

SQL> select * from x where y=3 and x=1;

执行计划
----------------------------------------------------------
Plan hash value: 2941724873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     6 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| X    |     1 |     6 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(TO_NUMBER("Y")=3 AND TO_NUMBER("X")=1)

Note
-----
   - dynamic sampling used for this statement

SQL>

带有复杂的条件的时候可能情况可能会更复杂。

阅读(1139) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

cormywang2013-12-13 13:54:36

楼主:执行计划那里有区别?