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

91 阅读5分钟

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

  1. 大数据体系与SQL 2022-08-18-16-21-13-image.png

其中分析引擎部分绝大部分提供了SQL接口,能够方便的进行数据处理。因此SQL对于大数据来说非常重要。One SQL rules big data all.

1、SQL的处理流程化

2022-08-18-16-25-25-image.png

1.1 Parser: 输入字符串,输出时抽象语法树。

    词法分析: 拆分字符串得到关键词、数值常量、字符串常量、运算符号等token

    语法分析: 将token组成AST node, 最终得到AST

实现方法:处理过程的实现:递归下降(ClickHouse),Flex和Bison(PostgreSQL),JavaCC(Flink),Antlr(Presto,Spark)

2022-08-18-16-59-56-image.png

1.2 Analyzer 和Logical Plan

Analyzer:

处理过程:

①检查并绑定元信息 (Database,table Column等) ②SQL的合法性检查 (例min/max/avg的输入是数值) ③AST到Logical Plan的转化 (可能会做,有些系统在其他组件实现)

Logical Plan: 逻辑地(只是描述功能,未指定算法)描述SQL对应的分步骤计算操作(算子);

2022-08-18-17-05-50-image.png

1.3查询优化

SQL始种声明式的语言 ,没指定具体的算法。查询优化的目标是找到正确且执行代价最小的物理执行计划。

1.4 Excutor

Plan Fragment: 执行计划子树

    目标:最小化网络数据传输

    利用上数据的物理分布(数据亲和性)

    增加Shuffle算子

Executor:

单机并行、多机并行。

2、查询优化器

2.1 查询优化器分类

两种分类方法:

1)根据遍历树的顺序不同划分为两种优化器:

Top-down Optimizer(从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划) 例子:SQLServer,Volcano/Cascade

Bottom-up Optimizer(从0开始,由下往上遍历计划树,找到完整的执行计划) 例子:System R(最早的优化器),PostgreSQL,IBM DB2

2)根据优化的方法不同划分为两种优化器:

①Rule-based Optimizer(RBO):主要是根据关系代数等价语义,重写查询;基于经验的启发式规则

②Cost-based Optimizer(CBO):使用一个模型估算执行计划的代价,选择代价最小的执行计划

现在系统使用的查询优化器可能上述方法都会用到

2.2 RBO

RBO是基于关系代数的等价变换

2022-08-18-20-17-39-image.png

  • RBO的优化原则:

1)读更少的数据、使访问速度更快(对I/O进行优化)

2)传输更少的数据、使传输速度更快(对Network进行优化)

3)处理更少的数据、处理速度更快(对CPU & Memory进行优化)

  • RBO的优化规则:

1)列裁剪(减少列扫描的数目)

2)谓词下推(在不影响最终结果的情况下可以把where的选择条件下移)

3)传递闭包

4)Runtime Filter(运行时产生的filter)

有三种常用的Runtime Filter:

① min-max filter:范围一定要是紧密的才有过滤意义

② in-list filter:用集合来表示范围,是min-max的优化,但数据量过大在网络传输过程会有速度限制

③ bloom filter:它的大小不会随着集合大小的变化而改变,把在bloom filter的数据扫描出来

主流RBO实现一般都有几百条基于经验归纳得到的优化规则(可到开源数据库查看它们的优化规则)

优点:实现简单,优化速度快

缺点:不能保证得到最优的执行计划(①全表扫描可能比索引扫描更好(查询数据分布十分不均匀时,索引扫描可能导致随机I/O) ②Join(连接)的物理实现无法选择是Hash join或SortMerge Join ③ 无法识别小表(Hash join需要用小表来构建哈希表)④多表连接)

2.3 CBO

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

CBO使用一个模型估算执行计划的代价,执行计划的代价等于所有算子执行代价之和

算子代价:CPU,内存,磁盘I/O,网络I/O等代价(叶子算子可以通过统计原始表数据得到;中间算子需要根据一定的推导规则,从下层算子的统计信息推导得到)

1)统计信息

  • 原始表的统计信息:①表或者分区级别(行数、行平均大小、表在磁盘中占了多少字节等);②列级别(列的min,max,num null,num not null,num distinct value,histogram等)
  • 推导统计信息:①选择率(对于某一个过滤条件,查询表会从表中返回多大比例的数据) ②基数(在查询计划中常指算子需要处理的行数)

2)统计信息的收集方式

DDL中定义的数据实时更新可能会导致插入数据时的处理速度过慢;手动执行可能会导致数据太旧;动态采样通常是通过query来实现的。

3)统计信息的推导规则

概论统计中的概论计算类比,要假设列之间的信息是独立的,才能有AND条件中式子的推导

4)统计信息存在的问题及处理方式

5)CBO执行计划的枚举(找出代价最小的执行计划的过程)

动态规划:

计算每一种可能的连接的cost,选择最小的

3.社区开源实践

介绍查询优化在社区开源实践,重点介绍Apache Caltite项目

- Apache Calcite

Calcite核心架构如下(作为SQL查询优化的中间层可以对接不同的存储系统):

2022-08-18-20-20-37-image.png

  • 小结
  1. 主流的查询优化器都包含RBO和CBO
  2. Apache Calcite是大数据领域很流行的查询优化器
  3. Apache Calcite RBO定义了许多优化规则,使用pattern匹配子树,执行等价变换
  4. Apache Calcite CBO基于Volcano/Cascade框架
  5. Volcano/Cascade的精髓:Memo、动态规划、剪枝

4. 前沿趋势

介绍SQL引擎的前沿趋势,重点介绍AI和DB的结合

四个主要的发展趋势:

2022-08-18-20-24-26-image.png