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

74 阅读2分钟

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

SQL的处理流程

查询优化

  • 执行计划子树

    • 最小化网络数据传输
    • 利用数据的物理分布
    • 增加shuffle算子【有更多的map和reduce同时进行】
  • Executor

    • 单机并行:cpu cache,指定的流水线(pipeline)乱序执行,SIMD(单指令流多数据流)
    • 多机并行:同一个fragment对应多个实例,一个fragment在多个节点上并行执行

常见的查询优化器

查询优化器分类

  • Top-down Optimizer

    从目标输出,由上向下遍历计划树,找到完整的最优执行计划【SQLServer】

  • Bottom-up Optimizer

    由下往上

RBO

运算符和等价变换和学校里的数据库基础一样,这里不多做解释

优化原则

  • 优化IO
  • 优化网络
  • 优化CPU和内存

优点:实现简单

缺点:不保证最优

  • 无法保证单表扫描的时候是索引还是全表
  • 无法选择最优Join【Hash or SortMerge】
  • 两表Hash Join的时候,优先选用小表构建哈希,但是RBO无法识别小表
  • 多表Join时,无法选择最优连接顺序

CBO

使用模型估算执行计划的代价,选择最优执行

  • 执行计划的代价是所有算子执行代价的总和
  • 利用RBO获得可能的等价执行计划

算子代价:CPU,内存,磁盘IO,网络IO

  • 与算子的输入数据有关
    • 叶子算子Scan:读数据
    • 中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
  • 与算子类型有关

统计信息 + 推导规则 -> 计算算子代价 -> 计算执行计划代价 -> 执行计划枚举

社区开源

自己用过的框架的查询优化器

Apache Calcite:

Hive,Flink,Alibaba MaxCompute

自研, RBO + CBO:

Spark, ClickHouse

Apache Calcite

解析SQL,进行优化。目的是做一个通用的SQL查询优化层,可以对接不同的存储系统

优点

  • 统一的SQL查询引擎

  • 支持异构数据模型

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