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

147 阅读4分钟

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

SQL处理流程——重点介绍SQL在分布式环境下的处理

Analyzer and Logical plan

Analyzer

检查并绑定Database,Table,Column等信息

SQL的合法性检查,比如min/max/avg的输入是数值

AST -> Logical Plan

Logical Plan

逻辑的描述SQL对应的分步骤计算操作

计算操作:算子(operator)

屏幕截图 2022-08-11 223230.png

算子

函数空间到函数空间上的映射

算法(algorithm) 是为了达到某个目标,实施的一系列指令的过程,而指令包含算子(operator)和操作数(operand)。

算子:operator, 简单说来就是进行某种“操作“,动作。算法中的一个函数、几行可以重复使用的代码、一个数学中的平方操作,这些都可以认为是算子

操作数: operand,被操作的对象,称之为操作数。

深度学习算法由很多计算单元组成,我们称这些计算单元为算子(Operator,简称OP)。

在深度学习中,算子对应每一层中的计算逻辑。

例如:

卷积层(Convolution Layer)中的卷积算法,可以认为是一个算子;

全连接层(Fully connected Layer)中的权值求和过程也可以认为是一个算子。

对于构建一个Deep Learning 模型来说,算子提升了效率。

广义的算子对任何函数进行某一项操作都可以认为是一个算子,甚至包括求幂次,开方都可以认为是一个算子,只是有的算子我们用了一个符号来代替他所要进行的运算罢了,所以大家看到算子就不要纠结,他和 f(x) 的 f 没区别,它甚至和加减乘除的基本运算符他是属于实数集的子集)对[0,1]区间的一个映射,我们知道实数域和[0,1]区间是可以一一映射的(这个后面再说),所以取概率符号P,我们认为也是一个算子,和微分,积分算子算子没区别。

总而言之,算子就是映射,就是关系,就是变换。

查询优化

SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做

目标:找到一个正确且执行代价最小的物理执行计划

查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP的

一般SQL越复杂,join的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能有成百上千倍

Physical Plan 和 Executor

Plan Fragment:执行计划子树

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

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

增加Shuffle算子

Executor

单机并行:cache,pipeline,SIMD

多机并行:一个fragment对应多个实例

小结

One SQL rules big data all

SQL 需要依次经过Parser,Analyzer,Optimizer和Executor的处理

查询优化器是数据库的大脑,在大数据场景下对查询性能至关重要

查询优化器需要感知数据分布,充分利用数据的亲和性

查询优化器按照最小化网络数据传输的目的把逻辑计划拆分成多个物理计划片段

常见的查询优化器——介绍查询优化器的分类,重点介绍RBO和CBO的原理

查询优化器的分类

按照遍历树的顺序分

Top-down Optimizer

从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划

例子:Volcano/Cascade,SQLServer

Bottom-up Optimizer

从零开始,由下往上遍历计划树,找到完整的执行计划

例子:System R,PostgreSQL,IBM DB2

根据优化方法去分类

PBO(Rule-based Optimizer)

根据关系代数等价语义,重写查询

基于启发式规则

会访问表的元信息(catalog),不会涉及具体的表数据(data)

CBO(Cost-based Optimizer)

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

1233356-f2518eb2ad8f28af.webp

关系代数

关系代数是过程查询语言,它以关系为输入,生成关系为输出。关系代数主要为关系数据库和SQL提供理论基础。其中, R*表示一个关系。输入关系,输出关系。 函数 f 表示关系算子。关系算子就是从关系到关系的映射。 关系运算中,支持的算子有:f = Cartesian product(×)、Projection (Π)、Selection (σ)、Rename (ρ)、join (⋈) 、Division (÷)等。