Cost-based query transformation in Oracle

Enhanced Subquery Optimizations in Oracle

Cost-based query transformation in Oracle

本文介绍Oracle的查询优化框架,

先描述,Oracal分别在RBO和CBO做了哪些事情,为什么要这样做

Heuristic Transformation

先看下RBO的部分,RBO部分的Rule基本都是确定可以带来优化的

Subquery Unnesting

子查询消除,子查询如果用apply的方式的话,文中称TIS,Tuple iteration semantics,基本等同于nested loop方式,比较低效

消除的方法分成两大类,

1. 把子查询 merge 到外部查询里面去

如下面的例子,把exists变成semi-join

2. 产生inline views,或derived table的方式,这种方式会放到CBO里面,所以后面给出例子

Join Elimination

消除无用的Join

其中Q4,dept_id是foreign key,所以每个employee都必须有一个dept,这里join起不到filter的作用

Filter Predict Move Around 

Filter下推,尽早的过滤数据,前提是这里的Filter是inexpensive的

Group Pruning

删掉在外层查询中不需要的group

下面的例子,在外层查询中,过滤city,那么city其实就决定了state,country,子查询中的group by 就没有必要了

Cost-Based Transformations

这里讲到重点,看下哪些Transformation应该在CBO里面去做的

Subquery Unnesting

第一个仍然是子查询消除,前面说了,如果是产生inline view的方式,需要用CBO

下面的例子,从Q1到Q10,产生了inline view或派生表 V

这里产生inline view的方式不一定会比nested loop的方式更好,如果filter出的row很少,而索引建的很好,很可能nested loop的方式更优

所以这种不确定的情况下,需要CBO来判断

Group-by and Distinct View Merging

右称为,Groupby Pull-up,如果join会大幅降低数据量,那么把groupby上提是核算的,因为groupby一般都是聚合,比较expensive的操作

比如下面Q11的例子,

把计算平均salary的inline view,挪到了外部查询的group by

可以看到把group by移到外面后,group by的field需要加上join key

Group-by Placement

对应于上面说的Pull Up,这里是Push Down

Join Predicate Pushdown

把外部查询的join predicate下推到子查询中,

一般套路都是uncorrelation,这里反之,不是所有情况都可以这样下推

例子,

Join Factorization

将公共的 join tables 上提

Predicate Pullup

将Expensive的Predicate进行上提,

Set Operator Into Join

Disjunction Into Union All

Framework For Cost-based Transformation

State Space Search Tech

CBO有个关键的问题是,如果Transformation持续变多,那么搜索空间是成指数级别上升的

针对这样的问题,比较可行的方式是引入随机算法,

Oracle的搜索算法如下,

Exhaustive,穷尽法

Iterative,局部最优,每次选择不同的初始点,有点像退火

Linear,动态回归

Two-pass,强行降低搜索空间

然后这里比较有借鉴意义,针对不同的search规模,我们应该选用不同的搜索算法

Transformation执行的方式

Oracle中按照顺序的方式去执行Transformations,

这里给出各个分类的执行顺序

当然有些情况下光顺序执行是不够的,

3.3里面提到了,

Interleaving方式,有些rule需要交叉的执行

举得例子是,Unnesting和View merging

Juxtaposition的方式,

Enhanced Subquery Optimizations in Oracle

本文讨论Oracle对于子查询的优化方法

Subquery Coalescing

子查询合并,把多个子查询合并成一个

这里提出,Container和Contained的概念

直观上,如果A contain B

A and B,就可以remove A

A or B,就可以removeB

Coalescing Subqueries of The Same Type

SameType,类型一样,要不都是Exist,要不都是Not Exist

和上面说的一致,只是这里加上Exist和Not Exist,有点绕

总之conjunction留小的,contained,disjunctive留大的,container

对于不满足Containment Property的子查询,仍然可能进行coalescing,

只要他们除了filter和predicates以外是equivalent的

这个很直观,因为如果只是Predicate不一样,是可以合并的

例子,虽然没有containment关系,但是仅仅只有predict不一样

可以看到,可以直接把Exists间的OR,转化为predict之间的OR,很直觉

Coalescing Subqueries of Different Type

不同的Type,Exist和Not Exist之间的

可以看TPC-H的Q21,

两个子查询是满足Containment关系的,但是类型不一样

这里的感觉就要从Container中挖去Contained的那块

是这样转换的,

用Having,对满足条件的case求sum,然后过滤,好tricky

Coalescing and Other Transformations

Q5加上外层的Join就是Q6

这里做的转换是,View merging,就是Groupby Pullup

但是GroupBy的Pull up还是Push down,需要通过cost-based来决定

Subquery Removal Using Window Functions

Oracle有窗口函数,可以用于替换子查询,论文里说,对于TCP-H,性能会有10倍提升

这里有subsume的概念,outer query包含子查询中的所有tables和predicates

这个例子,满足Subsume关系,在子查询中主要为了做AGG

所以这里用窗口函数就可以简单的remove掉子查询

Correlated Subsumed Subquery

相关子查询,在TCP-H中的代表是Q2,Q17

Q2,子查询中主要为了求min

用窗口函数,改造后

对于Q17,微软提出的是SegmentApply的方案,这里用窗口函数改造后,

底下关于Duplicate rows,没太懂

说是窗口函数必须within a view,没看出和上面的区别

Uncorrelated Subsumed Subquery

非相关子查询,TCP-H,Q15

用窗口函数转化为,因为是非相关子查询,所以OVER里面是空的,不需要PBY


查询优化 In Oracle的更多相关文章

  1. oracle 基础语法(二)

    一.实现分页 说明以下tablename是同一表.这些操作是对同一表(tablename)的操作 ======================================= 如何实现分页提取记录 ...

  2. Mssql迁移至Oracle 查询优化

    针对Oracle的查询优化 a.避免使用nclob类型字段,可以通过排除此类型的字段,优化查询b.避免对字段进行NULL值判断,如:SELECT * FROM  TABLE WHERE COL IS ...

  3. oracle 查询优化改写

    -----------书籍: oracle 查询优化改写-----------第1个“C###oracle”为登录数据库的用户名,第2个“oracleChange”为登录数据库的密码“oracleCh ...

  4. 《Oracle查询优化改写技巧与案例》学习笔记-------使用数字篇

    一个系列的读书笔记,读的书是有教无类和落落两位老师编写的<Oracle查询优化改写技巧与案例>. 用这个系列的读书笔记来督促自己学习Oracle,同时,对于其中一些内容,希望大家看到以后, ...

  5. Oracle 查询优化的基本准则详解

      注:报文来源:想跌破记忆寻找你 < Oracle 查询优化的基本准则详解 > Oracle 查询优化的基本准则详解 1:在进行多表关联时,多用 Where 语句把单个表的结果集最小化, ...

  6. 【书评:Oracle查询优化改写】第14章 结尾章

    [书评:Oracle查询优化改写]第14章 结尾章 一.1  相关参考文章链接 前13章的链接参考相关连接: [书评:Oracle查询优化改写]第一章 http://blog.itpub.net/26 ...

  7. 【书评:Oracle查询优化改写】第五至十三章

    [书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ...

  8. 【书评:Oracle查询优化改写】第四章

    [书评:Oracle查询优化改写]第四章 BLOG文档结构图 一.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① check的 ...

  9. 【书评:Oracle查询优化改写】第三章

    [书评:Oracle查询优化改写]第三章 BLOG文档结构图       导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 隐含参数 ...

随机推荐

  1. 实战FFmpeg + OpenGLES--iOS平台上视频解码和播放

    一个星期的努力终于搞定了视频的播放,利用FFmpeg解码视频,将解码的数据通过OpenGLES渲染播放.搞清楚了自己想知道的和完成了自己的学习计划,有点小兴奋.明天就是“五一”,放假三天,更开心啦. ...

  2. nrm 工具的使用

    一.什么是nrm? 这是官方的原话: 开发的npm registry 管理工具 nrm, 能够查看和切换当前使用的registry, 最近NPM经常 down 掉, 这个还是很有用的哈哈 顾名思义,就 ...

  3. [LeetCode] 78. 子集 ☆☆☆(回溯)

    描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3]输出:[ [3],  [1],  [2] ...

  4. 肖哥HCNP-学前准备篇笔记

    HCNA:助理 HCNP:工程师 HCIE:专家 vmvare workstation 1.安装 2.创建新的虚拟机-->典型-->稍后安装系统-->选择系统模式-->选择位置 ...

  5. PCB Layout设计规范——PCB布线与布局

    1.PCB布线与布局隔离准则:强弱电流隔离.大小电压隔离,高低频率隔离.输入输出隔离,分界标准为相差一个数量级.隔离方法包括:空间远离.地线隔开.     2. 晶振要尽量靠近IC,且布线要较粗   ...

  6. windows查看文件MD5值的命令

    今天需要,就记录一下. certutil -hashfile filename MD5 certutil -hashfile filename SHA1 certutil -hashfile file ...

  7. Kotlin反射实践操作详解

    继续对反射进行实战. 获取构造方法: 先定义一个主构造方法,2个次构造方法,接下来咱们用反射来获取一下构造方法: 其结果: [fun <init>(kotlin.Int, kotlin.S ...

  8. 最全 webpak4.0 打包性能优化清单

    最全 webpak4.0 打包性能优化清单 webpack4.0如何进行打包优化? 无非是从两个角度进行优化,其一:优化打包速度,其二:优化打包体积,送你一份打包性能优化清单 1.使用loader的时 ...

  9. 项目Alpha冲刺 8

    作业描述 课程: 软件工程1916|W(福州大学) 作业要求: 项目Alpha冲刺(团队) 团队名称: 火鸡堂 作业目标: 介绍第8天冲刺的项目进展.问题困难和心得体会 1.团队信息 队名:火鸡堂 队 ...

  10. Linux安装部署项目实例

    本次安装jdk,mysql,maven,redis,nginx,tomcat 安装之前先升级系统 使用命令:/bin/yum - y update 1.安装jdk 先建立一个项目的目录-jiaoton ...