SQL Optimizer解析|青训营笔记

110 阅读4分钟

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

本堂课重点内容:

  • 大数据体系和SQL(SQL的处理流程)
  • 常见的两种查询优化器(RBO、CBO)
  • 开源社区实践(Calcite)
  • 前沿趋势(引擎架构的进化、cloud、湖仓一体、DATA+AI)

一、大数据体系和SQL

1.1 大数据体系全景图

1.1.png

1.2 SQL语句执行的基本流程

1.2.png

Parser

将文本解析变成抽象语法树结构(AST);这个阶段涉及到了词法分析阶段(拆分字符串,提取关键字,字符串,数值等)和语法分析过程(把词条按照定义的语法规则组装成抽象语法树结构)

Analyzer

访问库/表元信息并绑定;去判断SQL是否合理,比如数据库,表和列名是否存在,列的数据类型是否正确;将AST转换成逻辑计划树

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

1.3.png

Optimizer(是本节课的重点)

查询优化的目标是为SQL找到一个正确的且执行代价最小的执行计划;

优化器的输出是一个分布式的物理执行计划,它的目标是在单机Plan的基础上最小化数据移动和最大化本地Scan,生成PlanFragment树。一个 PlanFragment 封装了在一台机器上对数据集的操作逻辑。每个PlanFragment 可以在每个 executor 节点生成 1 个或多个执行实例,不同执行实例处理不同的数据集,通过并发来提升查询性能。Plan 分布式化的方法是增加 shuffle 算子,执行计划树会以 shuffle 算子为边界拆分为PlanFragment。

1.4.png

Executor

Executor 按照物理执行计划扫描和处理数据,充分利用机器资源(CPU 流水线,乱序执行,cache,SIMD)

二、两种常见的查询优化器(RBO和CBO)

RBO

1.5.png基于关系代数等价规则对逻辑计划进行变换

实现上:

  • Pattern:定义了特定结构的 Operator 子树(结构)
  • Rule:定义了如何将其匹配的节点替换(Substitute)为新形态,从而生成新的、等价的Operator 树(原地替换)
  • 优化器搜索过程被抽象为不断匹配 Pattern 然后应用 Rule 转换,直到没有可以匹配的 rule

局限性:

  • 无法解决多表连接问题
  • 无法确定和选择最优的分布式 Join/Aggregate 执行方式

优化规则:

  • 列裁剪
  • 谓词下推
  • 传递闭包
  • Runtime Filter(min-max filter,in-list filter,bloom filter)
  • Join 消除
  • 谓词合并

CBO

1.6.png

思想

  • 使用一个模型估算执行计划的代价,选择代价最小的执行计划
  • 分而治之,执行计划的代价等于所有算子的执行代价之和
  • 通过 RBO 得到(所有)可能的等价执行计划(非原地替换)

算子代价包含 CPU,cache misses,memory,disk I/O,network I/O 等代价

  • 和算子的统计信息有关,比如输入、输出结果的行数,每行大小等
  • 叶子算子 scan:通过统计原始表数据得到
  • 中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
  • 具体的算子类型,以及算子的物理实现有关(e.g. hash join vs. sort join)

使用动态规划枚举所有执行计划,选出执行代价最小的执行计划

RBO和CBO的小结

1.7.png

三、开源社区实践

[Apache Calcite]

link.juejin.cn/?target=htt…

四、SQL相关的前沿趋势

  • 存储计算分离
  • HSAP, HTAP, HTSAP
  • Cloud Native, Serverless
  • 数据仓库,数据湖,湖仓一体,联邦查询
  • 智能化:AI4DB、DB4AI