这是我参与「第四届青训营」笔记创作活动的第1天。
课程目录
1. 大数据体系和SQL
2. 常见的查询优化器
3. 社区开源实践
4. 前沿趋势
1.大数据体系和SQL
1.1 大数据体系
1.2 SQL的处理流程
1.2.1 Parser
- 词法分析
- 语法分析
1.2.2 Analyzer和Logical Plan
- Analyzer:检查并绑定元信息
- Logical Plan:逻辑地描述SQL对应的分步骤计算操作
1.2.3 查询优化
- 目标:找一个正确且执行代价最小的物理执行计划
1.2.4 Physical Plan和Executor
Plan Fragment:执行计划子树
- 目标:最小化网络数据传输
Execuyor
- 单机并行
- 多机并行(相同实例读取不同数据)
2.常见的查询优化器
2.1 查询优化器分类
分类法
遍历树
- Top-down OPptimizer
- Bottom-up Optimizer
根据优化方法
- RBO
- CBO
2.2 RBO
2.2.1 RBO-关系代数
等价变换:结合律、交换律、传递性
- Select
- join(交换数据不影响查询结果)
2.2.2 RBO-优化规则
- 优化I/O
- 优化网络
- 优化CPU内存
例:
SELECT pv.sitreld,user.name
FROM pv JOIN user
ON pv.siteld = user.siteld AND pv.userld = user.id
WHERE user.siteld > 123;
2.2.3 RBO-列裁剪
2.2.4 RBO-谓词下推
where中的表达式称为谓词
2.2.5 RBO-传递闭包
根据表达式的等价关系和过滤条件可以得出新的过滤条件
2.2.6 RBO-Runtime Filter
- min-max
- in-list(缺点:集合个数多,网络开销大)
- bloom filter
RBO小结
- 优点:实现简单,优化速度快
- 缺点:无法保证得到最优的执行计划
2.3 CBO
执行流程
graph LR
统计信息+推导规则 --> 计算算子代价 --> 计算执行计划代价 --> 执行计划枚举
2.3.1 CBO-统计信息
统计信息分类
-
原始表统计信息
-
推导统计信息
- 选择率(selectivity)
- 基数(cardinality)
统计信息的收集方式
- 在DDL里指定需要收集的统计信息,数据库会在数据写入时收集或者更新统计信息。
- 手动执行explain analyze statement,触发数据库收集或者更新统计信息。
- 动态采样。
统计信息推导规则
假设列和列之间是独立的,列的值是均匀分布的
- AND条件
- OR条件
- NOT条件
- 等于条件
- 小于条件
2.3.2 CBO-执行计划枚举
CBO效果-TPC-DS Q25
TPC-DS开启/关闭CBO性能对比
小结
- RBO实现简单,优化速度快,但不保证能得到最优的执行计划
- CBO使用代价模型和统计信息估算执行计划的代价,同时使用贪心或者动态规划算法寻找最有执行计划
3.社区开源实践
3.1 Apache Calcite概览
统一的SQL查询引擎
- 框架图
3.2 Calcite RBO
HepPlanner
四种匹配规则
- ARBITRARY/DEPTH_FIRST:深度优先
- TOP_DOWN:拓扑顺序
- BOTTOM_UP:与TOP_DOWN相反
3.3 Calcite CBO
VolcanoPlanner
- 基于Volcano/Cascade框架
- Group winner:目前的最优计划 剪枝:减少搜索空间
4.前沿趋势
概览
对SQL优化器新要求
-
引擎架构的进化
-
Cloud云原生
-
湖仓一体
-
DATA+AI
- AI4DB
- DB4AI
本次课程个人总结
思考题 谓词下推的条件
谓词下推的原理是将过滤表达式尽可能移动至靠近数据源的位置,以使真正执行时能直接跳过无关的数据。
1. Left outer Join & Right outer Join
当过滤条件写在where且保留表的字段时可以谓词下推,反之不可,当过滤条件写在on且非保留表的字段时,可以谓词下推,反之不可。
| 保留表字段(left的左表) | 非保留表字段(left的右表) | |
|---|---|---|
| where | 可以 | 不可以 |
| on | 不可以 | 可以 |
2. Full outer Join
- 如果不开启cbo,写在on后面,还是where后面,都不会谓词下推
- 如果开启了cbo,写在where可以谓词下推,写在on不可以谓词下推
3. Inner Join
Inner Join不管有没有开启cbo,不管写在on后面还是where后面,都会进行谓词下推。