这是我参加「第四届青训营 」笔记创作的第1天
SQL Optimizer
01、大数据体系和SQL
1.1 大数据体系
上图展示了大数据的体系结构,从基础设施到存储结构最后到业务应用,每一层都有相应的解决方案,这节课主要集中在分析引擎层,也就是SQL 查询优化。
1.2 SQL的处理流程
在SQL查询优化器中,SQL会作为输入输入到优化器中,沿着Parser——Analyzer——Optimizer——Executor分别生成AST、Logical Plan、Physical Plan,如图:
下面依次介绍处理流程中的每个步骤。
1.2.1 Parser
Parser的功能简单来说就是解析输入的SQL字符串、进行词法分析和语法分析,将其转化成抽象语法树。
1.2.2 Analyzer
Analyzer的功能是检查Database、Table、Column等信息并将这些信息与对应的数据库绑定,同时检查输入数值是否合法。Analyzer将抽象语法树转化为逻辑计划。
1.2.3 Optimizer
SQL是一种声明式语言,只告诉数据库要干什么,没告诉数据库求怎么做,所以SQL查询优化的很有意义,它可以用来帮助数据库找到一个正确且执行代价最小的物理执行计划,从而大幅提高数据库查询速度。
1.2.4 Physical Plan 和 Executor
将被优化的Logical Plan划分为Plan Fragment(可执行子树),分给不同的分布式节点,以实现分布式的操作。
02、常见的查询优化器
查询优化器分类:
- Top-down Optimizer
- 从目标输出开始,由上往下遍历树,找到完整的最优执行计划
- 如:Volcano/Cascade,SQLServer
- Bottom-up Opitizer
- 从零开始,由下往上遍历计划树,找到完整的执行计划
- 例子:System R, PostgreSQL, IBM DB2
- RBO(Rule-based Optimizer)
- 会访问表的信息(catalog),不会涉及具体的表数据(data)
- CBO(Cost-based Optimizer)
- 使用一个模型估算执行计划的代价,选择代价最小的执行计划
2.1 RBO(Rule-based Optimizer)
RBO 通过关系代数的等价语义,基于启发式的规则优化查询,优化方法包括列裁剪、谓词下推、传递闭包、运行时过滤。优化的原则:
- 更快的读数据,读更少的数据(IO)
- 数据传播更少更快(Network)
- 处理数据更快,占用内存更少(CPU&Memory)
2.1.1 列裁剪
列裁剪的思想是将查询语句用到的列从数据库表中选择出来,尽早裁剪掉用不到列。
2.1.2 谓词下推
谓词下推的思想是尽可能将过滤条件下移,在join前执行过滤,这样可以大大减小join的时间和空间开销。
2.1.3 传递闭包
传递闭包的思想是在join前给表增加过率条件,其原理是join等式左右两边的列属性应该有相同的过滤条件,可以给两外一边的表怎加对应的过滤条件。例如join等式为pv.siteId = user.siteId,过滤条件为user.sitId > 123,那么对于pv.siteId也有pv.siteId > 123,这样在join前就能对pv表进行过滤,减少join的开销。
2.1.4 运行时过滤
运行时过滤的思想是在多表join前,可以根据其中一表的统计量来对另一表进行过滤。例如在知道了user表的连接属性siteId和userId的最大最小值后,可以用这些统计量对pv表进行提前过滤,从而减少join的开销。
2.2 CBO(Cost-based Optimizer)
CBO使用模型估计执行计划的代价,包括CPU、内存、磁盘I/O、网络I/O代价,然后选择代价之和最小的执行计划。
2.2.1 统计信息
统计信息的概念
统计信息包括原始表统计信息和推导统计信息:
- 原始表统计信息包括行数、行平均大小、表在词盘中占用了多少字节这样的表或者分区级别的表统计信息,也包括min、max、num nulls等列信息。
- 推导统计信息包括选择率和基数,其中选择率是指对于某一个过滤条件,查询会从表中返回多大比例的数据,基数是指在查询计划中算子需要处理的行数。
统计信息的收集方式
统计信息的收集方式包括数据库系统提前指定统计信息、手动执行 explain analyze statement 更新统计信息和动态采样三种方式。
统计信息推导规则和问题
统计信息的推导规则是基于列和行之间是独立的,列的值是均匀分布的,这在实际执行的时候会出现很多问题,因为现实中有很多列与列之间是有关的,而且列的值也不是均匀分布的。所以在实际执行计算代价的过程中要分析列于列的关系,从而进行更准确的统计信息推导。
2.2.2 执行计划枚举
单表扫描方式、join的实现方式和Join连接顺序在RBO中无法确定,因为它们的开销据情况而定。CBO中通过枚举每种执行计划来解决这个问题。 执行计划的枚举不是将所有情况都列出来,而是通过动态规划进行剪枝选择。
03、开源社区实践(Apache Calcite)
3.1 Apache Calcite 概览
Apache Calcite 中的HepPlanner和VolcanoPlanner起到RBO和CBO的作用。HepPlanner定义了许多的优化规则,使用pattern匹配子树,执行等价变换。VolcanoPlanner基于Volcano/Cascade框架,精髓在于Memo、动态规划、剪枝。
04、前沿趋势
在讲述的前沿知识中,我对 DATA+AI 比较感兴趣,尤其是通过深度学习对系统参数进行调整找到最佳的优化规则。
05.课堂小结
这节课首先介绍了大数据体系和SQL的处理流程,然后介绍了常见的优化器及其原理,接着带我们学习了开源社区框架Calcite的HepPlanner优化器和VolcanoPlanner优化器,最后带着我们探索了大数据的前沿趋势,让我对大数据框架有了一个清晰的了解,同时对RBO、CBO优化器有了深入的了解。