SQL Optimizer 解析(02) | 青训营笔记

103 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第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

执行流程:

image.png

  • 使用一个模型估算执行计划的代价,选择代价最小的执行计划

  • 分而治之,执行计划的代价等于所有算子的执行代价之和

  • 通过 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 行数,在查询计划中常指算子需要处理的行数