您当前位置:主页 > 资讯攻略 >
来源:未知
2021-05-31 21:09:05 浏览: 分类:资讯攻略

SQL条件的顺序对性能的影响

经常有人问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

攻略资讯
安卓软件