SQL处理流程思考 | 青训营笔记

102 阅读2分钟

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

(中间可能包含一些对项目1的思考,比较想选项目1,不过完全没了解过相关内容)

大数据体系和SQL

SQL的处理流程

image.png

开始的部分和编译原理是一样的,前两个部分分别是词法分析、语法分析,经过语义分析的检查后进入中间表示,这里上课的图使用了AST(抽象语法树进行表示,也可以用中间代码表示)。

到这一步,实际已经得到了需要执行的基本操作流(计算操作是各种算子)。(通常和所谓的编译的前端是一样的,对一个程序单线程即可完成分析)到目前为止和传统的编译原理完全一致。

剩余的部分和编译原理的剩下部分也有相似之处。SQL接下来需要进行查询优化,对应与编译原理中的中间代码优化。包括技术也有相似指出。

在传统编译原理中,中间代码的优化以基本块为单位,使用DAG进行公共子表达式的消除,后续还有代码生成过程的优化,包括数据流分析中的全局公共子表达式的分析,计算后延。而在SQL的优化中,同样构建了Logical Plan的左深度树,通过调整算子的位置进行分析,同样有遵循一定的规则。

Rule-based Optimizer (RBO)

  1. 根据关系代数等价语义,重写查询
  2. 基于启发式规则
  3. 会方位表的元信息,不会涉及具体的表数据

优化的原则:更少的IO,更少的网络传输,使用更少的CPU和内存(感觉基本都是针对JOIN)

具体的操作有:

  1. 列裁剪
  2. 谓词下推
  3. 传递闭包
  4. Runtime Filter ,使用布隆筛等操作

感觉和编译原理的优化还是挺像的,对执行流进行一定的经验规则优化。

这样的结果实现简单,优化速度快。

Cost-based Optimizer (CBO)

使用一个模型估算执行计划的代价没选择最小的执行计划

课上以JOIN的连接为例子。

适应动态规划算法,这样的问题解法和标准动态规划完全相同(和算法导论中的矩阵最小计算代价完全一致)

image.png

...最后一部分没有太了解过,后面有机会再补...