




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQLSQL 条件的顺序对数据库性能的影响条件的顺序对数据库性能的影响 数据恢复软件 经常有人问到 oracle 中的 Where 子句的条件书写顺序是否对 SQL 性能有影响 我的直觉是没有影响 因为如果这个顺序有 影响 Oracle 应该早就能够做到自动优化 但一直没有关于 这方面的确凿证据 在网上查到的文章 一般认为在 RBO 优化 器模式下无影响 10G 开始 缺省为 RBO 优化器模式 而在 CBO 优化器模式下有影响 主要有两种观点 a 能使结果最少的条件放在最右边 SQL 执行是按从右到左 进行结果集的筛选的 b 有人试验表明 能使结果最少的条件放在最左边 SQL 性能更高 查过 oracle8到11G 的在线文档 关于 SQL 优化相关章节 没有任何文档说过 where 子句中的条件对 SQL 性能有影响 到 底哪种观点是对的 没有一种确切的结论 只好自己来做实验 证明 结果表明 SQL 条件的执行是从右到左的 但条件的顺 序对 SQL 性能没有影响 实验一 证明了 SQL 的语法分析是从右到左的 下面的试验在9i 和10G 都可以得到相同的结果 第1条语 句执行不会出错 第2条语句会提示除数不能为零 1 Select ok From Dual Where 1 0 1 And 1 2 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 1 select from temp where to number t2 1 and t1 sz 2 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 子句中条件的顺序对性能没有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 4.2 质量的测量说课稿-2023-2024学年浙教版七年级上册科学
- 安全专项检查培训会内容课件
- 江苏省南通市通州高级中学2024-2025学年高一上学期第一次阶段测试地理试卷(含答案)
- 互联网企业与高校协同培养实习生人才协议
- COPD的定义及诊断课件
- 葡萄牙科技创新企业孵化指南
- 河南行政执法考试题库及答案
- 江西九江辅警考试题库及答案
- 智能电表教学课件
- 周茂远曾国藩课件
- 工程项目挂靠协议书
- QB/T 2660-2024 化妆水(正式版)
- 围手术期病人管理
- 垃圾中转站运营管理项目整体服务方案
- 血常规报告单
- 电路检查记录表
- 前牙黑三角的树脂充填
- 华为质量管理评估模型(31个评估要素和评估报告)
- 模具凸凹模工艺文件工序卡
- 储备店长培训工作流程-课件
- 药品效期管理
评论
0/150
提交评论