这是我参与「第四届青训营 」笔记创作活动的的第1天
这节课程从大数据体系和SQL、常见的查询优化器、开源社区实践和大数据的前沿趋势四个方面介绍SQL。
整体的思维导图如下:
一、 大数据体系和SQL
1. SQL语言的特点:
- 在数据处理中相比其他编程语言更简单,所用代码量更少;
- 分析引擎都配备有SQL的接口
One SQL rules big data all
2. SQL的处理流程
(1)Parser
String->AST(abstract syntax tree) 目的是进行词法分析和语法分析。
实现方式有:
- 递归下降
- Flex和Bison(PostgreSQL)
- JavaCC(Flink)
- Antlr(Presto,Spark)
(2) Analyzer
AST->Logical Plan 目的是检查并绑定元信息、SQL合法性检查。
在逻辑层面上描述SQL对应的操作,不涉及具体实现的算法。
(3) 查询优化
找到一个正确且执行物理最小的物理执行计划。
(4) Executor
将逻辑计划拆分成执行计划子树(Plan Fragment)。 目的是最小化网络数据传输,利用数据的物理分布。执行计划连接依靠增加Shuffle算子,一边发送,一边接收。
Executor可单机并行和多机并行
二. 常见的查询优化器
两种分类方法:
1.遍历树划分
①Top-down Optimizer
从输出开始,由上往下遍历计划树
②Bottom-up Optimizer
从零开始,由下往上遍历计划树
2.根据优化方法划分
①Rule-based Optimizer(RBO)
基于启发式原则,只会访问元信息,不涉及具体数据,基于经验归纳得到优化原则。
RBO的优化方向可以从I/O、网络、CPU和内存几个方面考虑。
优化方法:
- 列裁剪(从上往下扫描)
- 谓词下推(先执行filter,但是有条件,对join有要求)
- 传递闭包(根据表达式和过滤条件可以推导出新的过滤条件)
- Runtime Filter(借助哈希表 获得的信息可以构造三种filter:min-max,in-list,bloom filter)
优点:实现简单,优化速度快
缺点:不保证得到最优的执行计划
②Cost-based Optimizer(CBO)
使用模型估算执行计划的代价,选择代价最小的。
其中算子代价包括CPU、内存、磁盘I/O、网络I/O等。
叶子算子Scan通过统计原始表数据,中间算子根据推导规则,从下层算子得到。
①原始表统计信息包括表或分区的级别,列级别。推导信息包括选择率和基数。
收集方式:DDL指定需要收集的、手动执行explain analyze statement、动态采样
②CBO假设列与列之间独立,对于关联的列由用户指定或数据库自动识别相关联的列;假设数据均匀分布,可以用直方图解决。 ③执行代价则用到的所有算子代价的总和。 ④通常使用贪心算法或者动态规划选出最优的执行计划
三. 社区开源实践
由图可知主流的大数据的优化器RBO和CBO都有。
Apache Calcite-流行
特点:模块化,插件化,稳定可靠
Calcite RBO
优化规则:Pattern(匹配表达式子树)、等价变换
匹配规则:深度优先、拓扑顺序、BOTTOM_UP
Calcite CBO-基于Volcano/Cascade
Memo:存储候选执行计划 本质是AND/OR graph 用共享子树减少内存开销
Group:等价计划集合
Top-down 动态规划搜索
剪枝:减少搜索空间
四. 前沿趋势
Big Date,Big Money
- 对SQL优化器的新要求:
- 引擎架构的进化(存储计算分离/一体化)
- Cloud(云原生、severless)
- 湖仓一体(数据湖和数据仓库结合在一起、Query Federation)
- DATA+AI
AI4DB
AI可以为数据库做的工作:自配置(调参、负载预测调度)、自诊断和自愈合(错误恢复和迁移)、自优化(统计信息估计、代价估计、学习型优化器、索引/视图推荐)
DB4AI
数据库可以为AI提供的:内嵌人工智能算法、内嵌机器学习框架
五.总结
1.认识到SQL的重要地位,之前只是在单纯的使用SQL,这节课了解了SQL的处理流,其中优化器是最重要的部分。在小数据量上效果可能并不明显,但在大数据领域优化至关重要。
2.在多种查询优化器中有两种分类方式,两者可以相互叠加。RBO和CBO在企业中广为使用,掌握两种优化器是必需的。
3.从前沿趋势看,大数据方兴未艾,还有很大的发展空间,值得我们继续探索优化。