SQL Optimizer 解析||青训营

97 阅读5分钟

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

一、大数据体系

image.png

(1)String->AST(abstract syntax tree)

1.3SQL的处理流程

(1)String->AST(abstract syntax tree)

1.语法分析:拆分字符串,得到关键词、数值常量、字符串常量、运算符号等token
2.语法分析:将token组成AST node,最终得到有个AST

(2)实现:递归下降(ClickHouse),Flex和BIson(PostgreSQL),JavaCC(Flink),Antlr(Presto,Spark)

1.3.1SQL的处理流程 -Analyzer和Logical Plan

Analyzer

1.检查并绑定DatebaseTablesColumn等元信息
2.SQL的合法性检查,比如min/max/avg的输入是数值
3.AST->logical Plan3

Logical Plan

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

1.3.2 SQL的处理流程

1.SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做。
2.目标:找到一个正确且执行代价最小的物理执行计划
3.查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP4.一般SQL越复杂,join的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能有成百上千倍。

1.3.3 SQL的处理流程 -Physical Plan 和Executor PLan fragment:执行计划子树

`1.目标:最小化网络数据传输
 2.利用上数据的物理分别(数据亲和性)
 3.增加Shuffle算子`

Executor

单机并行:cache,pipeline,SIMd
多机并行:一个fragment对应多个实例

处理流程小结

`1.one sql rukes big all。
2.SQL需要依次经过Parser,Analyzer,Optimizer和Executor的处理。
3.查询优化是数据库的大脑,在大数据场景下对查询性能至关重要。
4.查询优化器需要感知数据分布,充分利用数据的亲和性。
5.查询优化器安装最小化网络数据传输的目标把逻辑计划拆分成多个物理计划片段。
`

二 常见的查询优化器

2.0查询优化器的分类

'1.RBO(Rule-based Optimizer)
 2.CBO (Cost-based Optimizer)

Top-down Optimizer

1.从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划
2.例子:Volcano/CascadeSQLServer

Bottom-up Optimizer

1.从零开始,由下往上遍历计划树,找到完整的执行计划
2.例子:System R,PostgreSQLIBM DB2
Rule-based O[timizer(RBO)
1.根据关系代数等价语义,重写查询
2.基于启发式规则
3.会访问表的元信息(catalog),不会涉及具体的表数据(data)
Cost-based Optimizer (CBO)
使用一个模型估算执行计划的代价,选择代价最小的执行计划。

2.2.1 常见的查询优化器 RBO-关系代数 image.png

2.2.2 RBO-优化原则

1.读取速度更少更快(i/o)。
2.传输速度更少更快(网络)。
3.处理数据速度更少更快(CPU和内存)。

3、RBO(Rule-based Optimizer)主要优化方式 (1)列剪裁
将不需要的列信息直接裁剪,大幅度减少查询时读取的读取数据量。
(2)谓词下推。
将数据过滤条件向下推,大幅度减少join操作时所需要读取的数据量
(3)传递闭包。
利用等价条件和过滤条件提取新的过滤条件,从而在谓词下推操作的基础上再次减少join操作所需要读取的数据量。
(4)Runtime Filter
在运行时利用列数据的min-max,in-list等信息减少Filter操作时所需要读取的数据量。

2.2 RBO小结

`主流RBO实现一般都有几百条基于经验归纳总结得到的优化规则
 优点:实现简单,优化速度快
 缺点:不保证得到最优的执行计划
 选择内存过大构建哈希表,容易导致内存溢出

3.2 CBO -概念

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

1.执行计划等于所有算子的执行代价之和。
2.通过RBO得到(所有)可能的等价执行计划。

算子代价:CPU,内存,磁盘I/O,网络I/o等代价

   1.和算子输入数据的统计信息有关
   2.叶子算子Scan:通过统计原始表数据得到
   3.中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
   4.和具体的算子类型,以及算子的物理实现有关

image.png

3.3 CBO-统计信息的收集方式

image.png

3.4 CBO-统计信息推导规则

image.png

3.5 CBO-统计信息的问题

image.png

3.6 CBO-执行计划枚举

`通常使用贪心算法或者动态规划宣称最优的执行计划`

3 CBO小结

`1.CBO使用代价模型和统计信息估算执行计划的代价
 2.CBO使用贪心算法或者动态规划寻找最优执行计划
 3.在大数据场景下CBO对查询性能非常重要
`

三、社区开源实践 1.社区开源实践-概况 image.png 2.社区开源实践 - Apache Calcite概览 image.png 3.社区开源实践 - Calcite RBO image.png

4.社区开源实践 - Calcite CBO

image.png

5.社区开源实践 - Calcite RBO

image.png

三、小结

`1.主流的查询优化器都包含RBO和CBO
 2.Apache Calcite是大数据很流行的查询优化器`
 3.Apache Calcite RBO定义了许多优化规则,使用Patterm匹配子树,执行等价交换
 4.Apache Calcite CBO基于Volcano/Casxade框架
 5.Volcan/Cascade的精髓:Memo、动态规划、剪枝。

4.前沿趋势

我个人觉得在将来各方面成熟的情况下,湖仓一体才是最种的趋势,但在此之前存储计算分离跟快捷一些,因为如果科技的进步就是为了方便,而分开是现在技术为了速度而不得不所进行的阉割。

S

image.jpeg