知识大全 oracle中Where子句顺序是否对SQL性能有影响

Posted 条件

篇首语:读书和学习是在别人思想和知识的帮助下,建立起自己的思想和知识。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 oracle中Where子句顺序是否对SQL性能有影响相关的知识,希望对你有一定的参考价值。

oracle中Where子句顺序是否对SQL性能有影响  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  经常有人问到oracle中的Where子句的条件书写顺序是否对SQL性能有影响 我的直觉是没有影响 因为如果这个顺序有影响 Oracle应该早就能够做到自动优化 但一直没有关于这方面的确凿证据 在网上查到的文章 一般认为在RBO优化器模式下无影响( G开始 缺省为RBO优化器模式) 而在CBO优化器模式下有影响 主要有两种观点          a 能使结果最少的条件放在最右边 SQL执行是按从右到左进行结果集的筛选的;  b 有人试验表明 能使结果最少的条件放在最左边 SQL性能更高   查过oracle 到 G的在线文档 关于SQL优化相关章节 没有任何文档说过where子句中的条件对SQL性能有影响 到底哪种观点是对的 没有一种确切的结论 只好自己来做实验证明 结果表明 SQL条件的执行是从右到左的 但条件的顺序对SQL性能没有影响   

  实验一 证明了SQL的语法分析是从右到左的

  下面的试验在 i和 G都可以得到相同的结果 第 条语句执行不会出错 第 条语句会提示除数不能为零

   Select ok From Dual Where / = And = ;   Select ok From Dual Where = And / = ;

  证明了SQL的语法分析是从右到左的   

  实验二 证明了SQL条件的执行是从右到左的

  drop table temp;  create table temp( t varchar ( ) t varchar ( ));  insert into temp values( zm abcde );  insert into temp values( sz );  insert into temp values( sz );  mit;

   select * from temp where to_number(t )> and t = sz ;   select * from temp where t = sz and to_number(t )> ;

  在 i上执行 第 条语句执行不会出错 第 条语句会提示 无效的数字   在 G上执行 两条语句都不会出错   说明 i上 SQL条件的执行确实是从右到左的 但是 G做了什么调整呢?

  实验三 证明了在 g上SQL条件的执行是从右到左的

  Create Or Replace Function F (v_In Varchar ) Return Varchar Is      Begin      Dbms_Output Put_Line( exec F );      Return v_In;  End F ;  /

  Create Or Replace Function F (v_In Varchar ) Return Varchar Is      Begin      Dbms_Output Put_Line( exec F );      Return v_In;  End F ;  /

  SQL> set serverout on;  SQL> select from dual where f ( )= and f ( )= ;           exec F   exec F

  SQL> select from dual where f ( )= and f ( )= ;           exec F   exec F

  结果表明 SQL条件的执行顺序是从右到左的   那么 根据这个结果来分析 把能使结果最少的条件放在最右边 是否会减少其它条件执行时所用的记录数量 从而提高性能呢?  例如 下面的SQL条件 是否应该调整SQL条件的顺序呢?

  Where A 结帐id Is Not Null  And A 记录状态<>   And A 记帐费用=   And (Nvl(A 实收金额 )<>Nvl(A 结帐金额 ) Or Nvl(A 结帐金额 )= )  And A 病人ID=[ ] And Instr([ ] ||Nvl(A 主页ID )|| )>   And A 登记时间Beeen [ ] And [ ]  And A 门诊标志<>

  实际上 从这条SQL语句的执行计划来分析 Oracle首先会找出条件中使用索引或表间连接的条件 以此来过滤数据集 然后对这些结果数据块所涉及的记录逐一检查是否符合所有条件 所以条件顺序对性能几乎没有影响   如果没有索引和表间连接的情况 条件的顺序是否对性能有影响呢?再来看一个实验

  实验四 证明了条件的顺序对性能没有影响

  SQL> select count(*) from诊疗项目目录where操作类型= ;COUNT(*)     

  SQL> select count(*) from诊疗项目目录where类别= Z ;COUNT(*)     

  SQL> select count(*) from诊疗项目目录where类别= Z and操作类型= ;COUNT(*)     

  Declare  V Varchar ( );  Begin      For I In Loop          Select名称Into V From诊疗项目目录Where类别= Z And操作类型= ;          select名称Into V from诊疗项目目录where操作类型= and类别= Z ;      End Loop;  End;  /

  上面的SQL按两种方式分别执行了 次查询 结果如下   类型= 在最右 | 类别= Z 在最右              |             |           |

cha138/Article/program/Oracle/201311/18112

相关参考

知识大全 oracle性能34条优化技巧

  ()选择最有效率的表名顺序(只在基于规则的优化器中有效)  ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名FROM子句中写在最后的表(基础表drivingtable)将被最先处理在

知识大全 WHERE子句操作符[2]

SQL必知必会:WHERE子句操作符[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!——此文章

知识大全 WHERE子句操作符[1]

SQL必知必会:WHERE子句操作符[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!——此文章

知识大全 oracle数据库sql的优化总结

  自己对oraclesql的一些优化总结自己也记录下来也希望对大家有帮助  一使用where少使用having;  二查两张以上表时把记录少的放在右边;  三减少对表的访问次数;  四有where子

知识大全 oracle提高查询效率

  ()选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名FROM子句中写在最后的表(基础表drivingtable)将被最先处理在F

知识大全 vfp 的sql的一道题

vfp的sql的一道题按照我们对数据处理的习惯,你这里的项目号应该是字符型的。所以where子句中的s1应该加双引号夹克的夹的读音夹克[jiākè]生词本基本释义详细释义[jiākè]一种短上衣。翻领

知识大全 Oracle常用SQL技巧

Oracle常用SQL技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  SELECT子句中避免

知识大全 Oracle中的高效语句

Oracle中的高效语句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Where子句中的连接顺

知识大全 Oracle数据库强制索引

Oracle数据库强制索引  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当where子句对某一

知识大全 oracle中怎么确定性能差的SQL语句

oracle中怎么确定性能差的SQL语句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前者很容