这是我参与「第四届青训营 」笔记创作活动的第18天
- 大数据体系与SQL
其中分析引擎部分绝大部分提供了SQL接口,能够方便的进行数据处理。因此SQL对于大数据来说非常重要。One SQL rules big data all.
1、SQL的处理流程化
1.1 Parser: 输入字符串,输出时抽象语法树。
词法分析: 拆分字符串得到关键词、数值常量、字符串常量、运算符号等token
语法分析: 将token组成AST node, 最终得到AST
实现方法:处理过程的实现:递归下降(ClickHouse),Flex和Bison(PostgreSQL),JavaCC(Flink),Antlr(Presto,Spark)
1.2 Analyzer 和Logical Plan
Analyzer:
处理过程:
①检查并绑定元信息 (Database,table Column等) ②SQL的合法性检查 (例min/max/avg的输入是数值) ③AST到Logical Plan的转化 (可能会做,有些系统在其他组件实现)
Logical Plan: 逻辑地(只是描述功能,未指定算法)描述SQL对应的分步骤计算操作(算子);
1.3查询优化
SQL始种声明式的语言 ,没指定具体的算法。查询优化的目标是找到正确且执行代价最小的物理执行计划。
1.4 Excutor
Plan Fragment: 执行计划子树
目标:最小化网络数据传输
利用上数据的物理分布(数据亲和性)
增加Shuffle算子
Executor:
单机并行、多机并行。
2、查询优化器
2.1 查询优化器分类
两种分类方法:
1)根据遍历树的顺序不同划分为两种优化器:
①Top-down Optimizer(从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划) 例子:SQLServer,Volcano/Cascade
②Bottom-up Optimizer(从0开始,由下往上遍历计划树,找到完整的执行计划) 例子:System R(最早的优化器),PostgreSQL,IBM DB2
2)根据优化的方法不同划分为两种优化器:
①Rule-based Optimizer(RBO):主要是根据关系代数等价语义,重写查询;基于经验的启发式规则
②Cost-based Optimizer(CBO):使用一个模型估算执行计划的代价,选择代价最小的执行计划
现在系统使用的查询优化器可能上述方法都会用到
2.2 RBO
RBO是基于关系代数的等价变换
- RBO的优化原则:
1)读更少的数据、使访问速度更快(对I/O进行优化)
2)传输更少的数据、使传输速度更快(对Network进行优化)
3)处理更少的数据、处理速度更快(对CPU & Memory进行优化)
- RBO的优化规则:
1)列裁剪(减少列扫描的数目)
2)谓词下推(在不影响最终结果的情况下可以把where的选择条件下移)
3)传递闭包
4)Runtime Filter(运行时产生的filter)
有三种常用的Runtime Filter:
① min-max filter:范围一定要是紧密的才有过滤意义
② in-list filter:用集合来表示范围,是min-max的优化,但数据量过大在网络传输过程会有速度限制
③ bloom filter:它的大小不会随着集合大小的变化而改变,把在bloom filter的数据扫描出来
主流RBO实现一般都有几百条基于经验归纳得到的优化规则(可到开源数据库查看它们的优化规则)
优点:实现简单,优化速度快
缺点:不能保证得到最优的执行计划(①全表扫描可能比索引扫描更好(查询数据分布十分不均匀时,索引扫描可能导致随机I/O) ②Join(连接)的物理实现无法选择是Hash join或SortMerge Join ③ 无法识别小表(Hash join需要用小表来构建哈希表)④多表连接)
2.3 CBO
使用一个模型估算执行计划的代价,选择代价最小的执行计划
CBO使用一个模型估算执行计划的代价,执行计划的代价等于所有算子执行代价之和
算子代价:CPU,内存,磁盘I/O,网络I/O等代价(叶子算子可以通过统计原始表数据得到;中间算子需要根据一定的推导规则,从下层算子的统计信息推导得到)
1)统计信息
- 原始表的统计信息:①表或者分区级别(行数、行平均大小、表在磁盘中占了多少字节等);②列级别(列的min,max,num null,num not null,num distinct value,histogram等)
- 推导统计信息:①选择率(对于某一个过滤条件,查询表会从表中返回多大比例的数据) ②基数(在查询计划中常指算子需要处理的行数)
2)统计信息的收集方式
DDL中定义的数据实时更新可能会导致插入数据时的处理速度过慢;手动执行可能会导致数据太旧;动态采样通常是通过query来实现的。
3)统计信息的推导规则
概论统计中的概论计算类比,要假设列之间的信息是独立的,才能有AND条件中式子的推导
4)统计信息存在的问题及处理方式
5)CBO执行计划的枚举(找出代价最小的执行计划的过程)
动态规划:
计算每一种可能的连接的cost,选择最小的
3.社区开源实践
介绍查询优化在社区开源实践,重点介绍Apache Caltite项目
- Apache Calcite
Calcite核心架构如下(作为SQL查询优化的中间层可以对接不同的存储系统):
- 小结
- 主流的查询优化器都包含RBO和CBO
- Apache Calcite是大数据领域很流行的查询优化器
- Apache Calcite RBO定义了许多优化规则,使用pattern匹配子树,执行等价变换
- Apache Calcite CBO基于Volcano/Cascade框架
- Volcano/Cascade的精髓:Memo、动态规划、剪枝
4. 前沿趋势
介绍SQL引擎的前沿趋势,重点介绍AI和DB的结合
四个主要的发展趋势: