SQL Optimizer 解析 | 青训营笔记

194 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第2天。

SQL Optimizer 解析

RBO(Rule-based Optimizer)

RB0优化方法:

  1. 列裁剪
  2. 谓词下推
  3. 传递闭包
  4. 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的等代价

  • 和算子输入数据的统计信息有关:输入,输出结果的行数
  • 具体的算子类型,以及算子的物理实现

统计信息:

  1. 原始表统计信息

  2. 推导统计信息

    • 选择率(selectivity):对于一个过滤条件,查询会从表中返回多大比例的数据

    • 基数(cardinality):算子需要处理的行数

      准确的cardinality.,远比代价模型本身重要。

  3. 统计信息的收集方式:

    • 在DDL里指定需要收集的统计信息
    • 手动执行explain analyze statement,缺点:收集的信息比较旧,没有实时性
    • 动态采样
  4. 统计信息推导规则:

假设列和列之间是独立的,列的值是均匀分布的。

  • 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

  1. One size fits all:统一的SQL查询引擎

  2. 模块化,插件化,稳点可靠

  3. 模块化,插件化,稳点可靠

  4. 支持异构数据模型:

    • 关系型
    • 半结构化
    • 流式
    • 地理空间数据
  5. 内置RBO和CBO

Calcite RBO

HepPlanner

优化规则(Rule)

  • Pattern:匹配表达式子树
  • 等价变化:得到新的表达式

四种匹配规则:

  1. 深度优先
  2. TOP_DOWN:拓扑排序
  3. BOTTOM_UP:按拓扑排序相反顺序去匹配
  4. 遍历所有rule,直到没有rule可以被触发

优化速度快,实现简单,但是不保证最优。

Calcite CBO

VolcanoPlanner

基于Volcano/Cascade框架

  1. 成本最优假设

  2. Top-down 动态规划搜索

  3. Memo:存储候选执行计划

    • Group:等价计划集合
  4. 应用Rule搜索候选计划

    • Memo:

      • 本质:AND/OR group
      • 共享子树减少内存开销
  5. Group winner

  6. 剪枝:减少搜索条件


前沿趋势

1. 引擎架构的进化,存储计算分离,一体化(HTAP.HSQP,HTSAP)

2. Cloud,云原生,serverless

3. 湖仓一体,Query Federation

4. DATA + AI

1. AI4DB

  ### 1. 自配置
        * 智能调参
        * 负载预测/调度
  2. 自诊断和自愈合:错误恢复和迁移
  3. 自优化
     * 统计信息估计
     * 代价估计
     * 学习型优化器
     * 索引/视图推荐

2. DB4AI

  ### 1. 内嵌人工智能算法
  ### 2. 内嵌机器学习框架