经常有人问oracle中Where子句的条件写入顺序是否对SQL性能有影响。我的直觉是没有影响,因为如果这个顺序有影响的话,Oracle应该早就可以实现自动优化了,但是一直没有这方面的确凿证据。网上找到的文章普遍认为在RBO优化器模式下没有影响(从10G开始,默认为RBO优化器模式),但主要有两种观点:
A.能做出最少结果的条件放在最右边,SQL执行是从右到左过滤结果集;
B.有实验表明,能做出最少结果的条件放在最左边,SQL性能更高。
查了oracle8到11G的在线文档,没有关于SQL优化的文档。它说where子句中的条件对SQL的性能有影响。哪种观点是对的?没有确定的结论,只能自己做实验来证明。结果表明,SQL条件的执行是从右向左的,但条件的顺序对SQL性能没有影响。
实验一:证明SQL的语法分析是从右向左的
下面的实验在9i和10G中可以得到相同的结果:第一条语句会被正确执行,第二条语句会提示除数不能为零。
1.从Dual中选择“确定”,其中1 / 0 = 1,1 = 2;
2.从Dual中选择“确定”,其中1 = 2,1/0 = 1;
证明了SQL的语法分析是从右向左的。
实验二:证明SQL条件的执行是从右向左的。
降低表温;
创建表temp( t1 varchar2(10),T2 varchar 2(10));
插入临时值(' zm ',' abcde ');
插入到临时值中(“sz”,“1”);
插入到临时值中(“sz”,“2”);
提交;
1.select * from temp where to _ number(T2)>1和t1 = ' sz
2.select * from temp其中t1='sz' and to_number(t2)>1;
在9i上执行,第一条语句不会出错,第二条语句会提示“无效数字为”。
当在10G上执行时,这两条语句都不会出错。
说明:在9i上,SQL条件的执行确实是从右向左,但是10G做了什么调整?
实验三:证明SQL条件在10g上的执行是从右向左的。
创建或替换函数F1(v_In Varchar2)返回Varchar2是
开始
Dbms_Outputput _ Line(' exec F1 ');
返回v _ In
结束F1;
/
创建或替换函数F2(v_In Varchar2)返回Varchar2是
开始
Dbms_Outputput _ Line(' exec F2 ');
返回v _ In
结束F2;
/
SQL & gt在上设置serverout
SQL & gt从dual中选择1,其中f1('1')='1 ',F2(' 1 ')= ' 1 ';
一个
-
一个
执行F2
执行F1
SQL & gt从dual中选择1,其中f2('1')='1 ',f1(' 1 ')= ' 1 ';
一个
-
一个
执行F1
执行F2
结果显示,SQL条件的执行顺序是从右到左。
本文链接:http://www.123down.cn/gonglue/227311.html