SQL Optimizer解析笔记 | 青训营笔记

81 阅读4分钟

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

课堂上首先提到了两种常用的事务型数据库(OLAP型):

MySQL和PostgreSQL:虽然国内MySQL使用的比较多,但学院派的PostgreSQL的代码更优雅,更适合学术研究。

SQL作为数据分析师、数据挖掘师大数据处理的接口

大数据体系 SQL处理的关键就是SQL在分布式环境下的优化。当对于MySQL和PostgreSQL这些单机型的数据库而言,大数据场景对SQL优化的需要更为迫切。

多个大数据计算引擎都支持 SQL 作为更高抽象层次的计算入口。

One SQL rules big data all!

image.png

SPARK 支持SQL接口、MapReduce支持SQL原语、Flink支持SQL接口、交互分析Presto等也是。

SQL 的一生

image.png

第一阶段:Parser

String(文本)àAST(抽象语法树)

涉及

词法分析阶段(拆分字符串,提取关键字,数值常量,字符串常量等token,token组成抽象语法树节点)

语法分析阶段(把词条按照定义的语法规则组装成抽象语法树结构)

实现包括:

ClickHouse的递归下降,PostgreSQL的Flex和Bison、Flink的JavaCC、Presto和Spark的Antlr。

Analyzer

检查并绑定DataBase、Table、Column的元信息。

SQL的合法性检查,比如数据库,表和列名是否存在,列的数据类型是否正确

将 AST 转换成逻辑计划树(在某些系统中这个工作由单独的 Converter 模块完成)

Logical Plan:逻辑执行计划

逻辑的描述SQL对应分步骤的计算操作(operator算子操作)

边表示数据流向,这里的计算只是一个逻辑,并不绑定算法实现

  image.png

  image.png

查询优化

找到正确且执行代价最小的物理执行计划

查询优化非常复杂,有很多边界Case,查询优化器很多问题都是NP的

大数据场景下多的时候几千行SQL,并且我们需要尽可能计算向数据移动,每个节点只读本地的数据,有的节点还需要执行shuffle算子,这要求查询优化器要感知数据分布、最小化网络数据传输并拆分逻辑计划到物理阶段。

image.png

查询优化器的分类

通过自顶向下和自底向上分类:

image.png

通过基于规则或者基于代价分类:

image.png

RBO 基于关系代数的等价变换,其中的等价变换包括结合律、交换律、传递性。

RBO 优化规则:

优化IO:读更少

优化网络:传输更少

CPU&Memory:执行更少

Pattern:定义了特定结构的 Operator 子树(结构)

Rule:定义了如何将其匹配的节点替换(Substitute)为新形态,从而生成新的、等价的Operator 树(原地替换)

优化器搜索过程被抽象为不断匹配 Pattern 然后应用 Rule 转换,直到没有可以匹配的 rule。

局限性:

无法解决多表连接问题

无法确定和选择最优的分布式 Join/Aggregate 执行方式

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

RBO列裁剪:从上到下扫描需要的列,减少CPU&Memory

image.png

谓词下推

谓词:Where中的表达。不同类型的join不同类型的fiter下推。

image.png

传递闭包:创造谓词下推

image.png

Runtime Fiter

构造哈希表得到集合特性:

image.png

Min-Max Filter 要求数据比较紧密

In-list Fiter

基于哈希的Bloom布隆过滤器 说一个元素不在就一定不在,说一个元素在有可能在。

Hash Join

Sort Merge Join

用小表构建哈希表 如何识别小表,选择错误的一边构建哈希表容易导致内存溢出

  image.png

RBO有几百条基于经验归纳的规则,实现简单、优化速度快,但不保证得到最优的执行计划。

image.png

CBO基于启发式规则,贪心算法和动态规划选择最优执行计划,优化时候会访问表的catalog,不会涉及具体表数据。CBO在大数据场景下非常重要。

image.png

image.png

Volcano/Cascade 框架

Memo

image.png

Cascades Optimizer 在搜索的过程中,其搜索的空间是一个关系代数算子树所组成的森林,而保存这个森林的数据结构就是 Memo。Memo 中两个最基本的概念就是Expression Group(下文简称 Group)以及Group Expression(对应关系代数算子)。每个 Group 中保存的是逻辑等价的 Group Expression,而 Group Expression 的子节点是由 Group 组成。

Memo 本质是 AND/OR Graph,通过共享相同的子树减少内存开销,记录搜索过的子树的最优执行计划(winner)

image.png 已搜索完成的物理计划的代价最小值成为 Cost Upper Bound。当新的搜索分支的代价高于它时,不需继续搜索。初始 Cost Upper Bound 可由优化器根据启发式规则估算

image.png 未来展望:

现在面对的瓶颈不是网络、IO而是CPU。

如何尽可能利用CPU Cache 流水线,向量执行,榨取CPU的潜力。

参考文献 juejin.cn/post/712275…