SQL查询优化器浅析 | 青训营笔记

108 阅读2分钟

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

写在前面

SQL优化是大数据查询引擎不可绕过的一个环节,我对Spark SQL使用上的经验让我对SQL的逻辑计划和物理计划优化产生兴趣,探索优化过程都经历了哪些步骤,特总结如下。

笔记正文

1. 大数据体系和SQL

One SQL rules big data all

1. SQL的梳理流程

  • SQL Parser to AST
  • AST Analyzer to Logical Plan
  • Logical Plan Opimizer to Physical Plan
  • Physical Plan to Executor

1. Parser

String -> AST

  • 词法分析
  • 语法分析

实现

  • 递归下降
  • Flex and Bison
  • JavaCC
  • Antlr

2. Analyzer和Logical Plan

  • Analyzer
    • 检查和绑定Database, table, column
    • SQL合法性检查
    • AST -> Logical Plan
  • Logical Plan
    • 逻辑地描述SQL对应的分步骤计算操作
    • 计算:算子 (operator)

3. 查询优化

  • 声明式语言
  • 目标
    • 找到一个正确且执行代价最小的物理执行计划

4. Physical Plan和Executor

  • Plan Fragment
    • 执行计划子树
    • 最小化网络传输数据是目的
    • 增加shuffle算子
  • Executor
    • 单机并行
      • cache, pipeline, SIMD
    • 多级并行
      • 一个fragment对应多个实例

2. 常见的查询优化器

1. 查询优化器的分类

  • Top-down Opt.
  • Bottom-up Opt.

2. Rule-based Optimizer

  • RBO 关系代数
    • 运算符
    • 等价变换
  • RBO 优化原则
    • read data less and faster
    • transfer data less and faster
    • process data less and faster
  • RBO 列裁剪
  • RBO 谓词下推
  • RBO 传递闭包
  • RBO Runtime Filter
  • RBO 小结
    • 主流RBO 实现一般都有几百条基于经验归纳得到的优化规则
    • 优势:实现简单,优化速度快
    • 缺点:不保证得到最优的执行计划

3. Cost-based Optimizer

  • CBO 概念
    • 使用一个模型估算执行计划的代价,选择代价最小的执行计划
    • 算子代价:CPU、内存、磁盘I/O、网络I/O
    • 统计信息+推导规则 -> 计算算子代价 -> 计算执行计划代价 -> 执行计划枚举
  • CBO 统计信息
    • 原始表统计信息
      • 表或者分区级别
      • 列级别
    • 推导统计信息
      • 选择率
      • 基数
    • 准确的cardinality比代价模型本身重要
  • CBO 统计信息收集方式
    • DDL里指定
    • 手动执行explain analyze statement
    • 动态采样
  • CBO 统计信息推导规则
  • CBO 执行计划枚举
    • 动态规划
  • CBO 效果
    • TPC-DS Q25
    • TPC-DS

3. 社区开源实践

  • Apache Calcite

4. 前沿趋势

  • Data + AI