这是我参与「第四届青训营 」笔记创作活动的的第2天,今天主要是整理了第一堂课上的笔记,由于时间有限所以没有全部整理完,等下一次再补充完整。
SQL Optimizer 解析
大数据体系
SQL
- 一种通用语言,希望通过SQL处理所有大数据
处理流程
Parser
- string -> AST 抽象语法树
- 词法分析
- 语法分析
Analiyzer
- 检查并绑定Database,Table,Column等元信息
- SQL的合法性检查,比如min/max/avg的输入是数值
- AST -> Logical plan
Logical plan
- 逻辑地表述SQL对应的分布计算操作
- 计算操作:算子(operator)
查询优化
在大数据场景下不同的查询计划会使性能差距很大,因此如何正确的执行计划是非常重要的一环。
- 拆分后可以利用Shuffle来进行收发
- 有点像负载均衡?把计划拆分之后,尽量避免跨节点流动,符合数据亲和性。
小结
- SQL是大数据的基础
- SQL的处理流程是Parser,Analyzer,Optimizer和Executor这几个部分
- 查询优化器是最发杂的模块,是数据库的核心组件,对于性能至关重要,选择合适的方式将事半功倍
- 查询优化器需要感知数据分布,充分利用数据的亲和性
- 查询优化器以最小化网络数据传输为目标将逻辑计划拆分为多个物理计划片段
常见的查询优化器
查询优化器分类
- TOP-dow 从目标输出开始,由上往下遍历计划树找到完整的最优执行计划
- Bottom - up 从0开始,由下往上遍历计划书
- RBO基于规则优化
- 根据关系代数等价语义,重写查询
- 基于启发式规则
- 访问表的源信息,不会涉及具体表数据
- CBO基于代价优化
- 使用一个模型估算执行计划代价,选择代价最小的执行计划
RBO
关系代数
优化原则
- I/O
- 网络(传输数据更快和更少)
- 程序数据
列裁剪
尽可能的减少数据,列裁剪之后只有需要的数据保留
谓词下推
在一定条件下下推谓词来进行过滤,以减少运算次数
传递闭包
通过传递闭包,将衍生出额外的筛选条件。
Runtime filter
得到一些集合的特性,稀释过滤表来避免hash冲突。
小结
CBO
概念
本质上就是通过建立模型来估算代价来筛选执行计划。
统计信息
统计信息的收集方式
- 在DDL里收集统计信息,数据库会在写入时收集或者更新统计信息
- 手动执行指令,触发数据库收集和更新
- 动态采样