SQL Optimizer 解析 | 青训营笔记

74 阅读4分钟

大数据体系

image-20220723213235952

SQL 的处理流程

img

  1. Parser (SQL -> AST)

    1. 词法分析:拆分字符串得到关键词(token)
    2. 语法分析:通过 token 得到抽象语法树(AST)
  2. Analyzer(AST -> Logical Plan)

    1. 检查并绑定 database、table、column 等元信息

    2. SQL 的合法性检查,比如 min 的输入是数值,表是否存在等

    3. Logical Plan : 逻辑的表述 SQL 的分步骤计算操作,得到逻辑计划树

    所谓逻辑计划树,可以理解为逻辑地描述一个 SQL 如何一步步地执行查询和计算,最终得到执行结果的一个分步骤地计划。树中每个节点是是一个算子,定义了对数据集合的计算操作(过滤,排序,聚合,连接),边代表了数据的流向,从孩子节点流向父节点。之所以称它为逻辑的,是因为算子定义的是逻辑的计算操作,没有指定实际的算法,比如对于逻辑的排序算子,逻辑计划树里没有指定使用快排还是堆排。

  3. Optimizer(Logical Plan -> Physical Plan)

    1. 本节的重点:查询优化,找到执行代价最小的正确的物理执行计划。
  4. Executor(Physical Plan -> )

    Plan Fragment:执行计划子树

    1. 目标:最小化网络数据传输
    2. 利用上数据的物理分布(数据亲和性)
    3. 增加 shuffle 算子

    Execulor

    1. 单机并行:cache、pipeline、SIMD
    2. 多机并行:一个 fragment 对应多个实例

常见的查询优化器

分类:

  • Top-down Optimizer:由上往下遍历整个计划树,找到最优执行计划。

  • Bottom-up Optimizer:由下往上遍历计划树,找到完整的执行计划。

  • Rule-based Optimizer (RBO)

    • 根据关系代数等价语义,重写查询
    • 基于启发式规则
    • 会访问表的元信息,不会涉及具体表数据
  • Cost-based Optimizer(CBO)

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

RBO-基于关系代数

  • 运算符:select,project,join,rename,union 等
  • 等价变换:结合律,交换律,传递性

优化方法:

  • 列裁剪
  • 谓词下推
  • 传递闭包
  • Runtime Filter

image-20220723223440946

CBO

综合各种算子的代价,选择一个代价最小的执行计划。模型的估算主要是通过统计信息得到的。

统计信息:

  • 原始表统计信息(行数,大小等)
  • 推导统计信息:选择率(过滤条件返回数据的比例)、基数(算子需要处理的行数))

统计信息的收集方式:

  • 在 DDL 里指定需要收集的统计信息
  • 手动执行 explain analyze statement,触发数据库收集或者更新统计信息
  • 动态采样,select count(*) from table_name

统计信息推导规则:

  • 假设列和列之间是独立的,列的值是均匀分布
  • fs(a AND b) = fs(a) * fs(b) ...

统计信息的问题:

  • 假设不成立

执行计划枚举:

  • 贪心或动态规划

小结

  • 主流 RBO 实现一般都有几百条基于经验归纳得到的优化规则
  • RBO 实现简单,优化速度快
  • RBO 不保证得到最优的执行结果
  • CBO 使用代价模型和统计信息估算执行计划的代价
  • CBO 使用贪心或者动态规划算法寻找执行计划
  • 大数据场景下 CBO 对查询性能非常重要

社区开源实践

image-20220724132038600

Apache Calcite 概览

  • 统一的 SQL 查询引擎

  • 模块化,插件化,稳定可靠

  • 支持异构数据模型

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

Calcite RBO

  • hepPlanner

    • 优化规则

      • Pattern 匹配表达式子树
      • 等价变换 得到新的表达式
    • 内置有 100+ 优化规则

    • 四种匹配规则

      • DEPTH_FIRST 深度优先
      • TOP_DOWN 拓扑排序
      • BOTTOM_UP 与上面的相反
    • 遍历所有的 rule ,直到没有 rule 可以被触发

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

Calcite CBO

  • VolcanoPlanner

    • 基于 Volcano/Cascade 框架

    • 成本最优假设

    • Memo:存储候选执行计划

      • Group:等价计划集合
      • 本质:AND/OR graph
      • 共享子树减少内存开销
    • Top-down:动态规划搜索,选择 winner 构建最优执行计划

    • 应用 Rule搜索候选计划

    • Group winner:目前的最优计划

    • 剪枝:减少搜索空间

前沿趋势

对 SQL 优化器的新要求:

  1. 引擎架构的进化

    1. 存储计算分离
    2. 一体化(HTAP,HSAP,HTSAP)
  2. Cloud

    1. 云原生
    2. serverless
  3. 湖仓一体

    1. Query Federation
  4. DATA + AI