SQL查询优化器RBO | 青训营笔记

203 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第1天

很高兴能在这个八月与优秀的同学们一起学习大数据方面的相关知识,今天我们开启了第一次课程——SQL Optimizer 浅析,在此记录一些笔记,以供后续查询与深入学习。

一. SQL的处理流程

sql执行流程

  1. Parse阶段: 对sql语句执行词法分析与语法分析,将之输出为AST(abstract syntax tree 抽象语法树),与编译原理类似
  2. Analyzer阶段:
    • 检查并绑定Database、Table、Column等元信息
    • SQL的合法性检查,如min/max/avg的输入是数字类型
    • 将AST输出为Logical Plan
  3. Optimizer:查询优化,找到正确且最小代价的物理执行计划
  4. Executor:执行

二.RBO查询优化器常见优化方式

SELECT pv.sitID,user.name
FROM pv JOIN user
ON pv.siteId = user.siteId AND pv.userId = user.id
WHERE user.siteId > 123

1. 列裁剪

对于一个查询,对应算子用不到的列尽早去除,减少IO和内存,为后续的优化带来便利。 image.png 优化时会从上往下扫描。

2. 谓词下推

谓词:where下的表达式。

即尽早进行filiter过滤,减少后续的开销(因为在前面过滤和在后面过滤对结果无影响)

image.png

3.传递闭包

  • 关系代数里的传递性
  • 根据一些表达式的等价关系+过滤条件 -> 新的过滤条件
  • 此例子中join前都做了filter操作,两边数据量会少很多,join会更快

image.png

4.Runtime Filter

执行时才能产生这个filiter。首先就是我们在右边filter之后,对右边的列获取哈希表,可以得到数据的范围信息(如min-max,in-list,bloom fliter),然后左边就可以形成一个filter。 image.png

三. 小结

老师的讲解很详细、到位,也感受到大家浓厚的学习热情,希望能在接下来的时间再接再厉,把握机会,学到相关知识,并完成对应的项目。