这是我参与[第四届青训营]笔记创作活动的第1天
本堂课重点内容:
- 大数据体系和SQL(SQL的处理流程)
- 常见的两种查询优化器(RBO、CBO)
- 开源社区实践(Calcite)
- 前沿趋势(引擎架构的进化、cloud、湖仓一体、DATA+AI)
一、大数据体系和SQL
1.1 大数据体系全景图
1.2 SQL语句执行的基本流程
Parser
将文本解析变成抽象语法树结构(AST);这个阶段涉及到了词法分析阶段(拆分字符串,提取关键字,字符串,数值等)和语法分析过程(把词条按照定义的语法规则组装成抽象语法树结构)
Analyzer
访问库/表元信息并绑定;去判断SQL是否合理,比如数据库,表和列名是否存在,列的数据类型是否正确;将AST转换成逻辑计划树
注:逻辑计划数:可以理解为逻辑的描述一个SQL如何一步步的执行查询和计算,最终得到执行结果的一个分步骤的计划。树中每个节点是一个算子,定义了对数据集合的计算操作(过滤、排序、聚合、连接),边代表了数据的流向,从孩子节点流向父节点。之所以称它为逻辑的,是因为算子定义的是逻辑的计算操作,没有指定实际的算法,比如对于逻辑的排序算子,逻辑计划树里没有指定使用快排还是堆排
Optimizer(是本节课的重点)
查询优化的目标是为SQL找到一个正确的且执行代价最小的执行计划;
优化器的输出是一个分布式的物理执行计划,它的目标是在单机Plan的基础上最小化数据移动和最大化本地Scan,生成PlanFragment树。一个 PlanFragment 封装了在一台机器上对数据集的操作逻辑。每个PlanFragment 可以在每个 executor 节点生成 1 个或多个执行实例,不同执行实例处理不同的数据集,通过并发来提升查询性能。Plan 分布式化的方法是增加 shuffle 算子,执行计划树会以 shuffle 算子为边界拆分为PlanFragment。
Executor
Executor 按照物理执行计划扫描和处理数据,充分利用机器资源(CPU 流水线,乱序执行,cache,SIMD)
二、两种常见的查询优化器(RBO和CBO)
RBO
基于关系代数等价规则对逻辑计划进行变换
实现上:
- Pattern:定义了特定结构的 Operator 子树(结构)
- Rule:定义了如何将其匹配的节点替换(Substitute)为新形态,从而生成新的、等价的Operator 树(原地替换)
- 优化器搜索过程被抽象为不断匹配 Pattern 然后应用 Rule 转换,直到没有可以匹配的 rule
局限性:
- 无法解决多表连接问题
- 无法确定和选择最优的分布式 Join/Aggregate 执行方式
优化规则:
- 列裁剪
- 谓词下推
- 传递闭包
- Runtime Filter(min-max filter,in-list filter,bloom filter)
- Join 消除
- 谓词合并
CBO
思想
- 使用一个模型估算执行计划的代价,选择代价最小的执行计划
- 分而治之,执行计划的代价等于所有算子的执行代价之和
- 通过 RBO 得到(所有)可能的等价执行计划(非原地替换)
算子代价包含 CPU,cache misses,memory,disk I/O,network I/O 等代价
- 和算子的统计信息有关,比如输入、输出结果的行数,每行大小等
- 叶子算子 scan:通过统计原始表数据得到
- 中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
- 具体的算子类型,以及算子的物理实现有关(e.g. hash join vs. sort join)
使用动态规划枚举所有执行计划,选出执行代价最小的执行计划
RBO和CBO的小结
三、开源社区实践
[Apache Calcite]
四、SQL相关的前沿趋势
- 存储计算分离
- HSAP, HTAP, HTSAP
- Cloud Native, Serverless
- 数据仓库,数据湖,湖仓一体,联邦查询
- 智能化:AI4DB、DB4AI