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

109 阅读2分钟

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

大数据体系和SQL

大数据体系

大数据体系.png

SQL的处理流程

1. Parser: String -> Abstract Syntax Tree (AST)

  • 词法分析(Lexical Analysis):拆分字符串成若干token
  • 语法分析(Syntactic Analysis):上一步的token作为AST的节点,形成AST

一个例子.png
实现:递归下降 (ClickHouse), Flex and Bison (PostgreSQL), JavaCC(Flink), Antlr (Presto, Spark)

2. Analyzer: AST -> Logical Plan

  • 绑定库/表元信息
  • 合理性判断(存在、数据类型等)
  • 转换成逻辑计划(结果导向的计划,并不涉及实现的算法)

image.png

3. Optimizer: Logical Plan -> Physical Plan

  • 目标:利用数据亲和性(数据的物理分布)最小化网格数据传输&&最大化Scan
  • 方法:优化逻辑计划(增删改节点)并分段成segment子执行计划(具体任务和节点的对应)
  • 子执行计划之间通过Shuffle算子连接 image.png

4. Executer: 执行Physical Plan

  • 单机并行:错位实施(cache, pipline, SIMD)
  • 多机并行:一个fragment对应多个实例,由多个节点同时进行(如上图)

常见的查询优化器

查询优化器分类

基于遍历顺序:

  • Top-down Optimizer
  • Bottom-up Optimizer

基于优化原理:

  • Rule-Based Optimizer (RBO): 不涉及具体表数据,仅根据启发式规则(基于经验)对关系表达式进行等价重写
  • Cost-Based Optimizer (CBO): 根据统计信息和代价模型选择cost最小的执行计划

RBO原理

  • 基于关系代数(运算符、定律)进行等价变化
  • 优化方向:I/O、网络、CPU和内存
  • 优化规则:
    1. 列裁剪
    2. 谓词下推
    3. 传递闭包
    4. Runtime Filter (min-max, in-list, bloom filter)
  • 评价:实现简单,但不一定最优

CBO原理

  • 通过RBO得到所有等价执行计划,模型估算算子代价后,选择代价最小的执行计划
  • 算子代价:
    • 和算子的统计信息有关:如叶子算子Scan、中间算子
    • 和具体的算子类型有关

(未完待续)

社区开源实践

前沿趋势