这是我参与「第四届青训营 」笔记创作活动的的第2天
02常见的查询优化器
主要分为两类:
- RBO(Rule-based Optimizer)
- CBO(Cost-based Optimizer)
(1)RBO
一句话概括:基于关系代数等价规则对逻辑计划进行变换
1)列裁剪
基本思想:对于一个算子,如果执行过程中用不到某列,就尽早将这些列去掉,节省IO。
2)谓词下推
基本思想:where后面的条件表达式不影响两表连接,则考虑将条件往下推,更早的进行过滤,过滤掉不必要的行数,减少计算开销。(条件:只适用于INNER JOIN)
思考:Left join 可以用吗?
3)传递闭包
基本思想:根据表达式的等价关系和过滤条件,推出新的过滤条件,同样将条件往下推。
4)Runtime Filter
基本思想:在执行过程中产生Filter。
总结:
- 优点:实现简单,优化速度快
- 缺点:不保证得到最优的执行计划
(2)CBO
执行流程:
-
使用一个模型估算执行计划的代价,选择代价最小的执行计划
-
分而治之,执行计划的代价等于所有算子的执行代价之和
-
通过 RBO 得到(所有)可能的等价执行计划(非原地替换)
-
算子代价包含 CPU,cache misses,memory,disk I/O,network I/O 等代价
-
和算子的统计信息有关,比如输入、输出结果的行数,每行大小等
-
叶子算子 scan:通过统计原始表数据得到
- 中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
- 和具体的算子类型,以及算子的物理实现有关(e.g. hash join vs. sort join)
-
-
使用动态规划枚举所有执行计划,选出执行代价最小的执行计划
-
统计信息
-
基表统计信息
- 表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等
- 列级别:min、max、num nulls、num、not nulls、num、distinct value(NDV)、histogram 等
-
推导统计信息
- 选择率(selectivity) :对于某一个过滤条件,查询会从表中返回多大比例的数据
- 基数(cardinality) :基本含义是表的 unique 行数,在查询计划中常指算子需要处理的行数