这是我参与「第四届青训营 」笔记创作活动的的第1天
(中间可能包含一些对项目1的思考,比较想选项目1,不过完全没了解过相关内容)
大数据体系和SQL
SQL的处理流程
开始的部分和编译原理是一样的,前两个部分分别是词法分析、语法分析,经过语义分析的检查后进入中间表示,这里上课的图使用了AST(抽象语法树进行表示,也可以用中间代码表示)。
到这一步,实际已经得到了需要执行的基本操作流(计算操作是各种算子)。(通常和所谓的编译的前端是一样的,对一个程序单线程即可完成分析)到目前为止和传统的编译原理完全一致。
剩余的部分和编译原理的剩下部分也有相似之处。SQL接下来需要进行查询优化,对应与编译原理中的中间代码优化。包括技术也有相似指出。
在传统编译原理中,中间代码的优化以基本块为单位,使用DAG进行公共子表达式的消除,后续还有代码生成过程的优化,包括数据流分析中的全局公共子表达式的分析,计算后延。而在SQL的优化中,同样构建了Logical Plan的左深度树,通过调整算子的位置进行分析,同样有遵循一定的规则。
Rule-based Optimizer (RBO)
- 根据关系代数等价语义,重写查询
- 基于启发式规则
- 会方位表的元信息,不会涉及具体的表数据
优化的原则:更少的IO,更少的网络传输,使用更少的CPU和内存(感觉基本都是针对JOIN)
具体的操作有:
- 列裁剪
- 谓词下推
- 传递闭包
- Runtime Filter ,使用布隆筛等操作
感觉和编译原理的优化还是挺像的,对执行流进行一定的经验规则优化。
这样的结果实现简单,优化速度快。
Cost-based Optimizer (CBO)
使用一个模型估算执行计划的代价没选择最小的执行计划
课上以JOIN的连接为例子。
适应动态规划算法,这样的问题解法和标准动态规划完全相同(和算法导论中的矩阵最小计算代价完全一致)
...最后一部分没有太了解过,后面有机会再补...