`
rbible
  • 浏览: 50360 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL条件顺序对效率的影响

阅读更多

    经常有人问到oracle中的Where子句的条件书写顺序是否对SQL性能有影响,我的直觉是没有影响,因为如果这个顺序有影响,Oracle应该早就能够做到自动优化,但一直没有关于这方面的确凿证据。在网上查到的文章,一般认为在RBO优化器模式下无影响(10G开始,缺省为RBO优化器模式),而在CBO优化器模式下有影响,主要有两种观点:

    a.能使结果最少的条件放在最右边,SQL执行是按从右到左进行结果集的筛选的;

    b.有人试验表明,能使结果最少的条件放在最左边,SQL性能更高。

    查过oracle8到11G的在线文档,关于SQL优化相关章节,没有任何文档说过where子句中的条件对SQL性能有影响,到底哪种观点是对的,没有一种确切的结论,只好自己来做实验证明。结果表明,SQL条件的执行是从右到左的,但条件的顺序对SQL性能没有影响。

 

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

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

Select 'ok' From Dual Where 1 / 0 = 1 And 1 = 2;
Select 'ok' From Dual Where 1 = 2 And 1 / 0 = 1;

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

 

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

 

    drop table temp;
    create table temp( t1 varchar2(10),t2 varchar2(10));
    insert into temp values('zm','abcde');
    insert into temp values('sz','1');
    insert into temp values('sz','2');
    commit;
select * from temp where to_number(t2)>1 and t1='sz';
select * from temp where t1='sz' and to_number(t2)>1;

 

    在9i上执行, 第1条语句执行不会出错,第2条语句会提示“无效的数字”

    在10G上执行,两条语句都不会出错。

    说明:9i上,SQL条件的执行确实是从右到左的,但是10G做了什么调整呢?

 

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

 

    Create Or Replace Function F1(v_In Varchar2) Return Varchar2 Is
    Begin
    Dbms_Output.Put_Line('exec F1');
    Return v_In;
    End F1;
    Create Or Replace Function F2(v_In Varchar2) Return Varchar2 Is
    Begin
    Dbms_Output.Put_Line('exec F2');
    Return v_In;
    End F2;
    SQL> set serverout on;
    SQL> select 1 from dual where f1('1')='1' and f2('1')='1';
    1
  ----------
    1
    exec F2
    exec F1
   SQL> select 1 from dual where f2('1')='1' and f1('1')='1';
    1
  ----------
    1
    exec F1
    exec F2

    结果表明,SQL条件的执行顺序是从右到左的。

    那么,根据这个结果来分析,把能使结果最少的条件放在最右边,是否会减少其它条件执行时所用的记录数量,从而提高性能呢?

    例如:下面的SQL条件,是否应该调整SQL条件的顺序呢?

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

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

 

    如果没有索引和表间连接的情况,条件的顺序是否对性能有影响呢?再来看一个实验。

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

    SQL> select count(*) from 诊疗项目目录 where 操作类型 = '1';
    COUNT(*)
  ----------
    3251
   SQL> select count(*) from 诊疗项目目录 where 类别 ='Z';
    COUNT(*)
  ----------
    170
    SQL> select count(*) from 诊疗项目目录 where 类别 = 'Z' and 操作类型 = '1';
    COUNT(*)
  ----------
    1
    Declare
    V1 Varchar2(20);
    Begin
    For I In 1 .. 1000 Loop
    --Select 名称 Into V1 From 诊疗项目目录 Where 类别 = 'Z' And 操作类型 = '1';
    select 名称 Into V1 from 诊疗项目目录 where 操作类型 ='1' and 类别 ='Z';
    End Loop;
    End;

 

    上面的SQL按两种方式分别执行了1000次查询,结果如下:

    操作类型= '1'在最右|类别='Z'在最右

          0.093       |      1.014

           1.06        |      0.999

           0.998       |      1.014

    按理说,从右到左的顺序执行,“类别='Z'”在最右边时,先过滤得到170条记录,再从中找符合“操作类型 = '1'”的,比较而言,“操作类型 = '1'”在最右边时,先过滤得到3251条记录,再从中找符合“类别='Z'”,效率应该要低些,而实际结果却是两者所共的时间差不多。

    其实,从Oracle的数据访问原理来分析,两种顺序的写法,执行计划都是一样的,都是全表扫描,都要依次访问该表的所有数据块,对每一个数据块中的行,逐一检查是否同时符合两个条件。所以,就不存在先过滤出多少条数据的问题。

 

    综上所述,Where子句中条件的顺序对性能没有影响(不管是CBO还是RBO优化器模式),注意,额外说一下,这里只是说条件的顺序,不包含表的顺序。

    在RBO优化器模式下,表应按结果记录数从大到小的顺序从左到右来排列,因为表间连接时,最右边的表会被放到嵌套循环的最外层。最外层的循环次数越少,效率越高

分享到:
评论

相关推荐

    ORACLE优化SQL语句,提高效率

     Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些能够过滤掉最大数量记录的条件必须写在WHERE子句的末尾。  (3)SELECT子句中避免使用‘*’:  Oracle在解析...

    oracle的sql优化

     大数据量表尽量要避免全表扫描,全部扫描会按顺序每条记录扫描,对于&gt;100万数据表影响很大。  Oracle中通过RowID访问数据是最快的方式  对字段进行函数转换,或者前模糊查询都会导致无法应用索引而进行全表扫描 ...

    SQL查询安全性及性能优化

    扫描:可以理解为对数据进行顺序访问,并未使用索引进行查找 查找:可以理解为用索引进行查找 因此查找效率高于索引扫描效率 执行计划的意义 对于我们开发高质量SQL是很有帮助的 首先可以帮助我们查看SQL语句...

    SQL优化之针对count、表的连接顺序、条件顺序、in及exist的优化

    主要介绍了SQL优化之针对count、表的连接顺序、条件顺序、in及exist的优化,有助于读者深入理解Oracle的运行效率及优化策略,需要的朋友可以参考下

    Oracle Sql 性能优化

    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 3、SELECT中避免使用 ‘ * ‘: ORACLE在解析的过程中, ...

    通过分析SQL语句的执行计划优化SQL(九)

    Join过程的各个步骤经常是...row source(表)之间的连接顺序对于查询的效率有非常大的影响。通过首先存取特定的表,即将该表作为驱动表,这样可以先应用某些限制条件,从而得到一个较小的row source,使连接的效率较高。

    SQL培训第一期

    1 SQL基础 1.1 基本概念 结构化查询语言(Structured Query Language)简称SQL,是一种关系数据库查询语言,用于存取数据以及查询、更新和管理关系数据库系统。 1.2 语句结构 1.2.1 数据查询语言(DQL) 对数据库进行...

    SQL性能优化

     WHERE后面的条件顺序影响  Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1  Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'  以上两个SQL中dy_dj(电压等级)及xh_bz(销户...

    SQL SERVER 2000开发与管理应用实例

    15.2.2 索引对查询结果顺序的影响 465 15.2.3 索引对数据操作的影响 469 15.3 数据库日志疑难解答 470 15.3.1 影响日志文件增长的因素 471 15.3.2 从事务日志中删除日志记录 472 15.3.3 日志文件...

    SQL Server 2008管理员必备指南(超高清PDF)Part3

    着重剖析应用技巧以帮助提高工作效率 主题包括办公应用和开发工具 认证考试教材 完全根据考试要求来阐述每一个知识点 提供可供搜索的Ebook(英文版)和训练题 提供实际场景案例分析和故障诊断实验 SQL Server专家的...

    SQL.Server.2008管理员必备指南.part4.rar(4/4)

     着重剖析应用技巧以帮助提高工作效率  主题包括办公应用和开发工具  认证考试教材  完全根据考试要求来阐述每一个知识点  提供可供搜索的Ebook(英文版)和训练题  提供实际场景案例分析和故障诊断实验  SQL...

    达梦数据库_SQL语言手册

    达梦数据库_SQL语言手册.pdf 数据库快照定义语句 数据库快照删除语句 第章数据查询语句和全文检索语句 单表查询 简单查询 带条件查询 集函数 情况表达式 连接查询 子查询 标量子查询 表子查询 派生表子...

    SQL Server 2008管理员必备指南(超高清PDF)Part1

    着重剖析应用技巧以帮助提高工作效率 主题包括办公应用和开发工具 认证考试教材 完全根据考试要求来阐述每一个知识点 提供可供搜索的Ebook(英文版)和训练题 提供实际场景案例分析和故障诊断实验 SQL Server专家的...

    SQL Server 2008管理员必备指南(超高清PDF)Part2

    着重剖析应用技巧以帮助提高工作效率 主题包括办公应用和开发工具 认证考试教材 完全根据考试要求来阐述每一个知识点 提供可供搜索的Ebook(英文版)和训练题 提供实际场景案例分析和故障诊断实验 SQL Server专家的...

    SQLServer2008查询性能优化 2/2

    识别常见性能问题以及对其快速处理的方法 实施修复甚至预防性能问题的T-SQL最佳实践 《SQL Server 2008查询性能优化》不是理论书籍,它的目的是帮助你避免数据库出现性能低下的状况,它还能帮助你保住你的工作。 ...

    SQLServer2008查询性能优化 1/2

    识别常见性能问题以及对其快速处理的方法 实施修复甚至预防性能问题的T-SQL最佳实践 《SQL Server 2008查询性能优化》不是理论书籍,它的目的是帮助你避免数据库出现性能低下的状况,它还能帮助你保住你的工作。 ...

    SQL.Server.2008管理员必备指南.part2.rar(2/4)

     着重剖析应用技巧以帮助提高工作效率  主题包括办公应用和开发工具  认证考试教材  完全根据考试要求来阐述每一个知识点  提供可供搜索的Ebook(英文版)和训练题  提供实际场景案例分析和故障诊断实验  SQL...

    SQL语法大全

    sql="select sum(字段名) as 别名 from 数据表 where 条件表达式" set rs=conn.excute(sql) 用 rs("别名") 获取统的计值,其它函数运用同上。 (5) 数据表的建立和删除: CREATE TABLE 数据表名称(字段1 类型1...

    SQL.Server.2008管理员必备指南.part1.rar(1/4)

     着重剖析应用技巧以帮助提高工作效率  主题包括办公应用和开发工具  认证考试教材  完全根据考试要求来阐述每一个知识点  提供可供搜索的Ebook(英文版)和训练题  提供实际场景案例分析和故障诊断实验  SQL...

Global site tag (gtag.js) - Google Analytics