我们提到了两种SQL优化器,分别是RBO和CBO。那么无论是RBO,还是CBO都包含了一系列优化规则,这些优化规则可以对关系表达式进行等价转换,从而寻找最优的执行计划。

  那么常见的优化规则就包括:

  列裁剪

  投影消除

  谓词下推

  最大最小消除

  常量传播

  其他

  在上述这些优化规则的基础上,就能够对关系表达式做出相应的等价转换,从而生成执行计划。本篇文章先从优化规则的基础概念逻辑算子开始讲起,后续会介绍各个优化规则。

  逻辑算子

  DataSource:数据源,也就是我们SQL语句中的表。select name from table1中的table1。

  Selection:选择,如select name from table1 where id = 1中的where后的过滤条件。

  Projection:投影,指搜索的列,如select name from table1 where id = 1中的列name

  Join:连接,如select * from table1 table2 where table1.name=table2.name就是把两个表做Join。连接条件是最简单的等值连接,当然还有其他我们熟知的inner join,left join,right join等等

  Sort:排序,如select * from table1 order by id里面的order by。无序的数据通过这个算子处理后,输出有序的数据。

  Aggregation:分组,如select sum(score) from table1 group by name中的group by。按照某些列进行分组,分组后可以进行一些聚合操作,比如Max、Min、Sum、Count、Average等等

  Apply:子查询,如select * from (select id,name from table1) as t中的(select id,name from table1) as t。可以进行嵌套查询。

  选择、投影、连接就是最基本的算子

  逻辑查询计划

  逻辑查询计划就是SQL语句通过SQL解析之后由各个逻辑算子组成的树状结构。

  比如我们由这样一条SQL:select user.name from user,score where user.id = score.id and score.num 60

  变成查询计划之后如图所示:

  user,score对应最下面的DataSource,负责读取数据。

  在上面由一个Join,将两个表的结果按user.id=score.id连接

  再按score.num 60 做一个Selection过滤

  最后将user.name做投影(Projection)

  而优化需要做的事情就是改变逻辑算子组成的逻辑查询计划,使它执行时的代价尽量的小。当然优化规则就是我们前面提到的那些了。

  既然由逻辑算子那么就有物理算子,物理算子和逻辑算子的不同在于,一个逻辑算子可能对应多种的物理算子的实现。比如Join的物理算子实现可以用NestLoop Join、HashJoin、MergeSort Join等,Aggregation可以用Hash或者排序后分组的不同做法,DataSource可以直接扫描全表也可以利用索引读取数据等等。

  所以我们常说的:“查询慢,加个索引啊”,要确保逻辑查询计划对应的物理计划走索引查询才行。

​

SQL优化器执行过程之逻辑算子的更多相关文章

  1. Sql优化器究竟帮你做了哪些工作

    https://my.oschina.net/u/1859679?tab=newest&catalogId=597012 上一篇,我们介绍了<DB——数据的读取和存储方式>,这篇聊 ...

  2. Sql优化器究竟帮你做了哪些工作?

    关系型数据库的一大优势之一,用户无需关心数据的访问方式,因为这些优化器都帮我们处理好了,但sql查询优化的时候,我不得不要对此进行关注,因为这牵扯到查询性能问题. 有经验的程序员都会对一些sql优化了 ...

  3. SQL优化器-RBO与CBO分别是什么

    数据库系统发展历史 数据库系统产生于20世纪60年代中期,至今有近50多年的历史,其发展经历了三代演变,造就了四位图灵奖得主,发展成为一门计算机基础学科,带动了一个巨大的软件产业. 数据库系统是操作系 ...

  4. 深入了解 TiDB SQL 优化器

    分享嘉宾:张建 PingCAP TiDB优化器与执行引擎技术负责人 编辑整理:Druid中国用户组第6次大数据MeetUp 出品平台:DataFunTalk 导读: 本次报告张老师主要从原理上带大家深 ...

  5. Oracle SQL优化器简介

    目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...

  6. 分享:SQL优化器简介

    SQL优化是我们经常会遇到的问题,无论你是专职的数据分析人员还是全栈开发大神或者是CURD搬运工. 我们在工作中经常会听到这样的声音:“查询慢?加个索引吧”.虽然加索引并不一定能解决问题,但是这体现了 ...

  7. SQL优化器简介

    文章导读: 什么是RBO? 什么是CBO? 我们在工作中经常会听到这样的声音:"SQL查询慢?你给数据库加个索引啊".虽然加索引并不一定能解决问题,但是这初步的体现了SQL优化的思 ...

  8. [转]Mysql中的SQL优化与执行计划

    From : http://religiose.iteye.com/blog/1685537 一,如何判断SQL的执行效率? 通过explain 关键字分析效率低的SQL执行计划. 比如: expla ...

  9. 从两表连接看Oracle sql优化器的效果

    select emp.*,dept.* from tb_emp03 emp,tb_dept03 dept where emp.deptno=dept.id -- 不加hint SQL> sele ...

随机推荐

  1. c# public private protected internal protected internal

    一个 访问修饰符 定义了一个类成员的范围和可见性.C# 支持的访问修饰符如下所示: public:所有对象都可以访问: private:对象本身在对象内部可以访问: protected:只有该类对象及 ...

  2. mongoDB之find()

    一.find方法 db.collection_name.find();查询 查询所有结果 1) db.users.find();类似于select * from users; 指定返回那些列(键) 2 ...

  3. 高德地图 js api 使用

    使用高德地图js api 制作网页上的地图应用. 1.先申请一个 开发者用的 key . 2. 在页面中引入高德提供的地图js  <script src="http://webapi. ...

  4. 对opencv.hpp头文件的认识

    OpenCV学习笔记(二):对opencv.hpp头文件的认识 - 安东的技术博客 - CSDN博客 https://blog.csdn.net/xidiancoder/article/details ...

  5. JavaScript教程3-js深入

    1.JS流程控制语句 (1).if 判断 if 语句是基于条件成立时才执行相应的代码. if...else 语句是在指定的条件成立时执行if后的代码,在条件不成立时执行else后的代码. if...e ...

  6. (转)Android工程出现 java.lang.NoClassDefFoundError错误解决方法

    在Eclipse中,导入Android工程,工程没有报错,运行时,出现 java.lang.NoClassDefFoundError类没有找到的错误.从问题上可以看出是导入包出错的原因.遂百度加谷歌. ...

  7. servlet 文件下载

    [本文简介] 一个servlet 文件下载 的简单例子. [文件夹结构] [java代码] package com.zjm.www.servlet; import java.io.BufferedIn ...

  8. 查询dubbo服务

    1.公司内网肯定会有服务治理平台,把自己提供的服务接口当关键字查询即可. 2.命令方式实现 查看本机Dubbo服务是否启动,telnet localhost [端口号],端口号是在注册dubbo服务的 ...

  9. git命令集合

    git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...

  10. QT Creator常用快捷键

    1.F10,F11 单步调试 2.Ctrl + / :注释/取消注释选定内容. 3.F4 :在 头文件(.h) 和 实现文件(.cpp) 之间进行切换. 4.Ctrl + i :自动格式化选中代码. ...