这是我参与「第四届青训营」笔记创作活动的第11天。
写在前面
SQL优化是大数据查询引擎不可绕过的一个环节,我对Spark SQL使用上的经验让我对SQL的逻辑计划和物理计划优化产生兴趣,探索优化过程都经历了哪些步骤,特总结如下。
笔记正文
1. 大数据体系和SQL
One SQL rules big data all
1. SQL的梳理流程
- SQL Parser to AST
- AST Analyzer to Logical Plan
- Logical Plan Opimizer to Physical Plan
- Physical Plan to Executor
1. Parser
String -> AST
- 词法分析
- 语法分析
实现
- 递归下降
- Flex and Bison
- JavaCC
- Antlr
2. Analyzer和Logical Plan
- Analyzer
- 检查和绑定Database, table, column
- SQL合法性检查
- AST -> Logical Plan
- Logical Plan
- 逻辑地描述SQL对应的分步骤计算操作
- 计算:算子 (operator)
3. 查询优化
- 声明式语言
- 目标
- 找到一个正确且执行代价最小的物理执行计划
4. Physical Plan和Executor
- Plan Fragment
- 执行计划子树
- 最小化网络传输数据是目的
- 增加shuffle算子
- Executor
- 单机并行
- cache, pipeline, SIMD
- 多级并行
- 一个fragment对应多个实例
- 单机并行
2. 常见的查询优化器
1. 查询优化器的分类
- Top-down Opt.
- Bottom-up Opt.
2. Rule-based Optimizer
- RBO 关系代数
- 运算符
- 等价变换
- RBO 优化原则
- read data less and faster
- transfer data less and faster
- process data less and faster
- RBO 列裁剪
- RBO 谓词下推
- RBO 传递闭包
- RBO Runtime Filter
- RBO 小结
- 主流RBO 实现一般都有几百条基于经验归纳得到的优化规则
- 优势:实现简单,优化速度快
- 缺点:不保证得到最优的执行计划
3. Cost-based Optimizer
- CBO 概念
- 使用一个模型估算执行计划的代价,选择代价最小的执行计划
- 算子代价:CPU、内存、磁盘I/O、网络I/O
- 统计信息+推导规则 -> 计算算子代价 -> 计算执行计划代价 -> 执行计划枚举
- CBO 统计信息
- 原始表统计信息
- 表或者分区级别
- 列级别
- 推导统计信息
- 选择率
- 基数
- 准确的cardinality比代价模型本身重要
- 原始表统计信息
- CBO 统计信息收集方式
- DDL里指定
- 手动执行explain analyze statement
- 动态采样
- CBO 统计信息推导规则
- CBO 执行计划枚举
- 动态规划
- CBO 效果
- TPC-DS Q25
- TPC-DS
3. 社区开源实践
- Apache Calcite
4. 前沿趋势
- Data + AI