当前位置: 首页 > news >正文

基于Oracle的SQL优化--学习(十七)

表移除

   表移除是优化器处理带多表连接的目标SQL的一种优化手段,它是指优化器会把虽然在目标SQL中存在,但是其存在与否对最终执行结果没有影响的表从该目标SQL中移除,这样优化器至少可以少做一次表连接,进而就能提高原目标SQL的执行效率。

Oracle如何处理SQL语句中的IN

   优化器在处理带IN的目标SQL时,可能也会用到査询转换,也即本节要介绍的IN-ListExpansion(又称为ORExpansion,两者等价)。为了能让大家明白IN-ListExpansion的优缺点,本节除了会介绍IN-ListExpansion之外,还会介绍优化器在处理带IN的目标SQL时可能会使用的其他方法。在Oracle数据库里,IN和OR是等价的,优化器在处理带IN的目标SQL时实际上会将其转换为带OR的等价改写SQL,也就是说,本节介绍的处理带IN的目标SQL的方法也同样适用于带OR的目标SQL。

    优化器在处理带IN的目标SQL时,通常会采用如下这四种方法:
    (1)使用IN-List Iterator。
    (2)使用IN-List Expansion。
    (3)使用IN-List Filter。
    (4)对IN做子査询展开,或者既做子查询展开又做视图合并。

IN-List Iterator

    IN-List Iterator是针对IN后面是常量集合的一种处理方法。此时优化器会遍历目标SQL中IN后面的常量集合中的每一个值,然后去做比较,看目标结果集中是否存在和这个值匹配的记录。如果存在匹配记录,则这个记录就会成为该SQL的最终返回结果集中的一员;如果不存在匹配记录,则优化器会继续遍历IN后面的常量集合中的下一个值,直到该常量集合遍历完毕。
关于IN-ListIterator,有如下几点需要注意:
(1)IN-ListIterator是Oracletf对目标SQL的IN后面是常量集合的首选处理方法,它的处理效率通常都会比IN-ListExpansion高。

(2)Oracle能用IN-ListIterator来处理IN的前提条件是IN所在的列上一定要有索引。

(3)不能强制让Oracle走IN-ListIterator类型的执行计划,Oracle里也没有相关的强制走IN-ListIterator的Hint,但可以通过联合设置10142和10157事件来禁掉IN-ListIterator。

IN-List Expansion/OR Expansion

   IN-List Expansion/OR Expansion(IN-List Expansion又称为OR Expansion,两者等价)是针对IN后面是常量集合的另外一种处理方法,它是指优化器会把目标SQL中IN后面的常量集合拆开,把里面的每个常量都提出来形成一个分支,各分支之间用UNIONALL来连接,即IN-ListExpansion的本质是把带IN的目标SQL等价改写成以UNIONALL连接的各个分支。

    IN-List Expansion的好处是改写成以UNIONALL连接的分支后,各个分支就可以各自走索引、分区修剪(PartitionPruning)、表连接等相关的执行计划而互不干扰。它的坏处是未做IN-ListExpansion之前优化器只需要解析一个目标SQL并决定其执行计划,而一旦做了IN-ListExpansion后优化器就要对等价改写后的每一个UNIONALL分支都执行同样的解析、决定执行计划的工作,也就是说,等价改写后的目标SQL的解析时间会随着UNIONALL分支的递增而递增。这意味着当IN后面的常量集合所包含的元素数量非常多的时候,做IN-ListExpansion仅解析的时间可能就会非常长,这就是IN-ListIterator通常会比FN-ListExpansion的效率高的原因。正是基于上述原因,做了IN-ListExpansion的等价改写SQL的执行效率并不一定会比原SQL高,这也就意味着IN-ListExpansion—定也是基于成本的,即只有当经过IN-ListExpansion后的等价改写SQL的成本值小于原SQL的成本值时,Oracle才会对目标SQL执行IN-ListExpansion。

IN-List Filter

    IN-List Filter是针对IN后面是子查询的一种处理方法,优化器会把IN后面的子査询所对应的结果集当作过滤条件,并且走FILTER类型的执行计划IN后面是子查询,意味着IN后面是变量的集合;走的是FILTER类型的执行计划,意味着Oracle并没有对IN后面的子査询做子查询展幵。所以,能走IN-ListFiltei类型的执行计划就意味着目标SQL要满足如下两个条件:

    (1)目标SQL的IN后面是子査询而不是常量的集合。
    (2)Oracle未对目标SQL的IN后面的子査询做子査询展开。



相关文章:

  • JDK、Spring、Quartz等几种不同定时器的用法,以及cronExpression表达式定义
  • hibernate,将原生SQL执行的结果转换为Map
  • Stimulsoft Reports.Net基础教程(四):创建主从报表②
  • IntelliJ IDEA解决创建maven web项目慢的问题
  • 一些使用IDEA的诀窍
  • Tomcat启动时,webapps目录下的项目没有加载
  • 马哥预习视频
  • Document base xxx does not exist or is not a readable directory
  • 一位资深程序员大牛给予Java初学者的学习路线建议
  • WITH AS的用法
  • pivot的用法
  • POJ1840 Eqs(hash)
  • Dangling meta character '+' near index 0,解决办法
  • swift - 将表格滚动条移动到底部
  • 把springboot项目设置成Windows系统开机启动
  • [译]前端离线指南(上)
  • 【译】理解JavaScript:new 关键字
  • 11111111
  • Docker 笔记(2):Dockerfile
  • export和import的用法总结
  • golang 发送GET和POST示例
  • Gradle 5.0 正式版发布
  • HTTP请求重发
  • Node项目之评分系统(二)- 数据库设计
  • React-flux杂记
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 成为一名优秀的Developer的书单
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 技术:超级实用的电脑小技巧
  • 聚簇索引和非聚簇索引
  • 前端临床手札——文件上传
  • 正则表达式小结
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 正则表达式-基础知识Review
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​【已解决】npm install​卡主不动的情况
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #define,static,const,三种常量的区别
  • #FPGA(基础知识)
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (分类)KNN算法- 参数调优
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)Linux下编译安装log4cxx
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转载)利用webkit抓取动态网页和链接
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET 表达式计算:Expression Evaluator
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET 中让 Task 支持带超时的异步等待