这是我参与「第四届青训营 」笔记创作活动的的第2天。
SQL Optimizer 解析
RBO(Rule-based Optimizer)
RB0优化方法:
- 列裁剪
- 谓词下推
- 传递闭包
- Runtime Filter
RBO优缺点:
优点:实现简单,优化速度快 缺点:因为基于经验,所以不保证得到最优的执行计划。
- 单表扫描:索引扫描(随机I/O)vs 全表扫描(顺序I/O)如果查询的数据分布非常不均衡,索引扫描可能不如全表扫描
- 分布式下Join实现:基于哈希表的链接(Hash Join) vs 基于排序归并的链接(SortMerge Join),无法判断连接方式
- 两表Hash Join :用小表构建哈希表---如何识别小表 多表Join:
- 哪种链接顺序是最优的?
- 是否对每种组合都探索?
CBO(Cost-based Optimizer)
定义:使用一个模型估算执行计划的代价,选择代价最小的执行计划。
执行计划代价 = Σ算子代价之和
算子代价:CPU,内存,磁盘I/O,网络I/O的等代价
- 和算子输入数据的统计信息有关:输入,输出结果的行数
- 具体的算子类型,以及算子的物理实现
统计信息:
-
原始表统计信息
-
推导统计信息
-
选择率(selectivity):对于一个过滤条件,查询会从表中返回多大比例的数据
-
基数(cardinality):算子需要处理的行数
准确的cardinality.,远比代价模型本身重要。
-
-
统计信息的收集方式:
- 在DDL里指定需要收集的统计信息
- 手动执行explain analyze statement,缺点:收集的信息比较旧,没有实时性
- 动态采样
-
统计信息推导规则:
假设列和列之间是独立的,列的值是均匀分布的。
-
Filter Selectivity:
- AND条件:fs(a AND b) = fs(a) * fs(b)
- NOT条件:fs(NOT a) = 1 - fs(a)
- 等于条件:1/NDV(列中独立互不相同值的个数)
- 小于条件:(literal - min) / (max - min)
缺点:假设经常与显示不符
执行计划枚举
通常使用贪心算法或者动态规划选出最优的执行计划
社区开源实践
Apache Calcite
-
One size fits all:统一的SQL查询引擎
-
模块化,插件化,稳点可靠
-
模块化,插件化,稳点可靠
-
支持异构数据模型:
- 关系型
- 半结构化
- 流式
- 地理空间数据
-
内置RBO和CBO
Calcite RBO
HepPlanner
优化规则(Rule)
- Pattern:匹配表达式子树
- 等价变化:得到新的表达式
四种匹配规则:
- 深度优先
- TOP_DOWN:拓扑排序
- BOTTOM_UP:按拓扑排序相反顺序去匹配
- 遍历所有rule,直到没有rule可以被触发
优化速度快,实现简单,但是不保证最优。
Calcite CBO
VolcanoPlanner
基于Volcano/Cascade框架
-
成本最优假设
-
Top-down 动态规划搜索
-
Memo:存储候选执行计划
- Group:等价计划集合
-
应用Rule搜索候选计划
-
Memo:
- 本质:AND/OR group
- 共享子树减少内存开销
-
-
Group winner
-
剪枝:减少搜索条件
前沿趋势
1. 引擎架构的进化,存储计算分离,一体化(HTAP.HSQP,HTSAP)
2. Cloud,云原生,serverless
3. 湖仓一体,Query Federation
4. DATA + AI
1. AI4DB
### 1. 自配置
* 智能调参
* 负载预测/调度
2. 自诊断和自愈合:错误恢复和迁移
3. 自优化
* 统计信息估计
* 代价估计
* 学习型优化器
* 索引/视图推荐
2. DB4AI
### 1. 内嵌人工智能算法
### 2. 内嵌机器学习框架