这是我参与「第四届青训营 」笔记创作活动的的第1天
青训营大数据网课:SQL查询优化器
1. 大数据体系和SQL
大数据体系 - One SQL rules big data all。大数据体系包括业务应用(BI报表)、数据开发(Airflow)、权限管控(Apache Ranger)、分析引擎(Spark,Flink)、资源调动(YARN)以及维护管理等等板块。本节课主要介绍分析引擎的SQL的查询优化器。
SQL目前仍然是最流行的数据库查询语言,众多引擎都支持其应用。SQL的处理流程如下:
首先SQL的字符串会经过Parser处理,通过词法分析拆分字符串,得到关键字、数值常量等token。然后再语法分析,将这些token最终转化为AST(abstract syntax tree)。得到AST的方法一般有递归下降(ClickHouse),Flex等。
获得AST以后,Analyer会检测并绑定Database,column等元素信息,检查SQL的合法性。然后输出logical plan(逻辑地描述SQL对应的分步骤计算操作)。
最后,这些logical plan经过Optimizer优化后会交给Executor来执行(存在单机并行和多机并行两种情况)。
2. 常见的查询优化器
SQL是声明式语言,用户只是描述要做什么。也就是说具体做什么没由数据库自己决定。因此,其中有这很大的优化空间并且查询优化也意义重大。因为,一般项目都存在很复杂的SQL语句,Join的表很多,查询优化的作用也就非常之大。
分类:查询优化器分为Top-down Optimizer(如Volcano/Cascade)和Bottom-up (如System R)两种。即自上而下和自下而上。
本节课,主要介绍了两种查询优化器,RBO(rule-based Optimizer)和CBO(cost-based Optimizer)。
RBO
RBO 能够基于启发式规则根据关系代数等价语义,重写查询。会访问表的元信息(catalog)但不会访问数据(data)。个人理解,所谓rules,就是各种数学上的等价变换方法。通过这些变换,减少扫描(scan)的的列数,行数等,从而达到减少计算量的优化。
优化原则:
- Read data less and faster (I\O) 输入输出端更快的读取数据,读取更少的数据。
- Transfer data less and faster (Network) 网络传输数据更少、更快。
- Process data less and faster (CPU & Memory) 处理更少的数据,更快的处理数据 (个人理解:从而减少CPU的使用数量,减少内存的使用)。
以下介绍四种RBO优化算法
1.列裁剪
检测Jion时需要的列,提前扫描这些列,省去了原来需要扫描整个表的时间。
2.谓词下推
将Where语句里面的谓词下推到scan扫描的时候执行。提前筛选出符合条件的行数,在列裁剪的基础上进一步优化。
3.传递闭包
通过传递律,如图,识别出pv.sited也必须满足 >123 的条件。这样,在pv扫描以后,直接过滤,减少了要处理的行数。
4.Runtime Filter
Runtime filter的原理是通过在join的probe端提前过滤掉那些不会命中join的输入数据来大幅减少join中的数据传输和计算,从而减少整体的执行时间。
起初我还有点疑问,因为扫描的两个表不一样,Runtime Filter Builder是通过扫描user表构建的,那pv表如何使用这个算子呢?后来我发现,因为这个Runtime Filter是传递闭包之后的步骤,先通过传递,得到pv.sited 和 user.sited 相等的关系,再使用runtime filter的时候就能处理pv表了。
小结:RBO还是比较基础,其主要原理就是通过等价变换,减少要处理的行数列数,达到优化的目的。那么优点必然是实现比较简单,优化速度快。缺点是不能保证得到的优化方案是最优解。其次,多表链接也无法优化等等。RBO还是存在很多缺陷。
CBO
CBO是基于Cost的优化,其中Cost指的是执行SQL所需要的资源,通常是行数rowcount,CPU,内存,IO (这些被称为算子代价)等等。具体流程如下:
-
需要被统计信息分为两种,原始表统计信息和推导统计信息。原始表统计信息主要统计表或者分区级别(行数、行平均大小等)和列级别(max、min等)。而推导统计信息则代表选择率(查询会从表中返回多大比例等数据)与基数(查询时需要处理的行数)。
-
统计信息推到规则是在假设列与列独立的基础上,符合概率的逻辑规则。例如:AND条件 fs(a AND b) = fs(a) * fs(b)。然而实际情况是列与列通常会有关联,因此,我们往往通过直方图来得到统计信息。
-
执行计划枚举的时候通常使用贪心算法和动态规划。课上讲的贪心算法,还是很基础的,就是优先选择执行最低cost算子。算法的优点是实现简单,方便。缺点是可能不能找到最优解。动态规划课上讲的不多,我自己再补充一下。
动态规划是将大问题划分为小问题进行解决,从而一步步获取最优解。动态规划算法和分治算法类似,基本思想也是将待求解的问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解与分治法不同的是,使用于动态规划求解的问题,经分解得到的子问题往往不是互相独立的。(即下一个阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解) 动态规划可以通过填表的方式逐步推进,得到最优解。(见:# 动态规划算法)
后面两部分内容主要是介绍大数据社区的开发与前景。时间不是很够,此处就不再多写了。