这是我参与「第四届青训营」笔记创作活动的第1天
-
一、本堂课的重点内容 SQL查询优化器
-
二、详细知识点介绍:
-
大数据的体系和SQL: 希望通过SQL处理所有的data SQL的处理流程:
- Parser: str->AST(abstract syntax tree):拆分字符串成不同的token,再将其组成为AST node,最终得到AST
- Analyzer:检查并绑定元信息+SQL是否正确+AST➡️logic plan
- 查询优化器对数据库来说非常重要(感知数据分布&数据亲和性)
- 常见的查询优化器
- 查询优化器的分类:
-
- top—down optimizer:从目标开始从上往下遍历计划树,找出完整的最优执行计划(eg:SQLServer)
-
- Bottom-up optimizer:从零开始,由下往上遍历计划树,找到完整的执行计划
-
- Rule-based optimizer(RBO):根据关系代数的等价语义重写查询,基于启发式规则,会访问表的catalog但不会涉及具体的data(实现简单,优化速度快但是不保证能得到最优的执行计划)
-
-
- 运算符&等价变换
- 运算符&等价变换
-
-
-
- 优化原则:Read data less and faster(I/O);transfer data less and faster(Network);process data less and faster(CPU&/Memory)
eg:
- 优化原则:Read data less and faster(I/O);transfer data less and faster(Network);process data less and faster(CPU&/Memory)
eg:
-
-
-
- 列裁剪:从上往下扫描,计算project需要哪些列,依次传递,最终得到所有的列的集合,scan时只需要扫描几列
-
-
-
- 谓词下推
- 谓词下推
-
-
- -传递闭包
-
-
- runtime filter(产生新的filter, 用在join的查询端)
-
-
- Cost-based optimizer(CBO):实用模型估算并选择代价最小的执行计划(贪心算法/动态规划)
-
- -统计信息:
-
-
-
- 原始表统计信息:表/分区级别;列级别
-
-
-
-
-
- 推导统计信息:selectivity;cardinality
-
-
-
-
- 统计信息的收集方式:在数据库里面制定需要收集的统计信息;手动执行explain analyze statement; 动态采样
-
-
-
- 统计信息推导规则:
-
-
-
- 执行计划枚举:
-
三、实践练习例子(社区开源实践)
- Apache Calcite:
- 其中的RBO:HepPlanner使用patter匹配子树,执行等价交换
- 其中的CBO:VolcanoPlanner(基于Volcano/Cascade:Memo,动态规划,剪枝)
- 前沿趋势:
- 引擎架构的进化:存储计算分离
- Cloud:云原生
- 湖仓一体
- Data+AI
四、课后个人总结: 本节课讲师主要讲述了SQL的查询优化器分类以及主要介绍了CBO和RBO的工作原理并将其在实践中的运用(如:calcite中的CBO和RBO的运用)