知识大全 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的解析器按照从右到左的顺序处理FROM子句中的表名FROM子句中写在最后的表(基础表drivingtable)将被最先处理在
SQL必知必会:WHERE子句操作符[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!——此文章
SQL必知必会:WHERE子句操作符[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!——此文章
自己对oraclesql的一些优化总结自己也记录下来也希望对大家有帮助 一使用where少使用having; 二查两张以上表时把记录少的放在右边; 三减少对表的访问次数; 四有where子
()选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名FROM子句中写在最后的表(基础表drivingtable)将被最先处理在F
vfp的sql的一道题按照我们对数据处理的习惯,你这里的项目号应该是字符型的。所以where子句中的s1应该加双引号夹克的夹的读音夹克[jiākè]生词本基本释义详细释义[jiākè]一种短上衣。翻领
Oracle常用SQL技巧 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! SELECT子句中避免
Oracle中的高效语句 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Where子句中的连接顺
Oracle数据库强制索引 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 当where子句对某一
oracle中怎么确定性能差的SQL语句 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 前者很容