这是我参与「第四届青训营」笔记创作活动的的第1天。
本文记录了我在大数据基础班的第一节课的课堂笔记,以及部分曾经学过的关系代数的复习。原文是在本地编辑完成后上传,部分课件截图限于版权并未上传。
受限于个人水平,难免有疏漏,欢迎指正讨论。
概述
本节课程主要分为 4 个方面:
- 大数据体系和 SQL;
- 常见的查询优化器;
- 查询优化器的社区开源实践;
- SQL 相关的前沿趋势。
知识结构
1.1 大数据体系
本次的青训营课程主要讲解大数据体系中的分析引擎、存储系统、资源调度几部分。
1.2 SQL处理流程
说明:
-
Parser
SQL语句经过
Parser转换为AST(抽象语法树) -
Analyzer
Analyzer将AST转化为Logical Plan逻辑计划-
Analyser
检查绑定 Database,Table,Column等元信息
检查合法性
AST -> Logical Plan
-
Logical Plan
只是逻辑地描述SQL分步骤计算操作,不记录详细的实现方式
-
-
Optimizer 查询优化
查询优化,为Logical Plan寻找一个执行代价最小的Physical Plan(物理执行计划)。
同时,关系代数存在一个等效查询的概念,即不同语句返回相同结果的现象,即 不同的表达会影响语句效率。
分布式SQL中,需要此模块优化执行性能,单机SQL效率差异不明显。
-
Physical Plan和Executer
-
Plan Fragment 执行计划子树
将物理执行计划拆分为子树
-
2.1 查询优化器分类
-
遍历执行计划树的方式划分
-
Top-down Optimizer
从目标输出开始,由上往下遍历
-
Bottom-up Optimizer
从零开始,由下往上遍历
-
-
Rule-based Optimizer(RBO)
- 关系代数等价语义,重写查询,即等效查询的原理
- 基于启发式规则??
- 访问元数据(catalog),不涉及具体数据(data)
-
Cost-based Optimizer(CBO)
- 使用模型预估执行代价
2.2 RBO
2.2.1 关系代数
等价变换:结合律、交换率、传递性
等效查询的概念
不同语句可以实现同样的查询效果,这些语句被称为等效查询。关系代数等价语义,重写查询的查询优化,正是基于此。
2.2.2 优化原则
-
列裁剪
执行操作中,数据表中的某些列是不需要的,可以尽量早地将所需的列读出,进行操作 ,避免读入不需要的列。
-
谓词下推
不影响结果前提下,尽量早地执行数据缩减,例如条件筛选、过滤操作。如图,在执行JOIN前就进行数据缩减操作,不影响结果,JOIN步骤所处理数据减少了。
不是所有的JOIN都适用如图的谓词下推操作,SQL语句显示该JOIN操作为inner join,outer join需要另外讨论
-
传递闭包
没有谓词,创造谓词来下推! 已经进行完字面上的谓词的下推,根据关系代数传递性,推到出新的过滤条件,再进行谓词下推。
-
Runtime Filter (执行时产生的过滤)
原理
在对表进行JOIN操作时,选择其中之一表进行哈希,得出特征,将这些特征组成的过滤规则(Runtime Filter)传递给另一张表。
常用过滤算法:
- min-max:限制范围,缺点:要求数据分布集中,存在异常值效果差。
- in-list:直接导出需要遍历数据的集合(或者去重的列表,即元素独立互不相同),缺点:需要访问的数据量大时,需要传递的list将会很大,网络开销大。NDV独立的互不相同元素个数。
- bloom filter:
RBO 小结
2.3 CBO
使用模型估算执行计划的代价,选择代价最小的。
2.3.1 CBO-统计信息
- 原始统计信息
- 推导统计信息
统计信息收集方式
统计信息推导规则
- 假设列与列之间是独立的,列的值均匀分布。
- 选择率推导,导出每步筛选说需要的数据占总体的比率。
2.3.2 CBO-执行计划枚举
-
贪心算法
-
动态规划
假定:全局最优的方案在局部也是最优的,从而将全局最优的方案拆分为寻找局部最优的方案。
CBO 小结
3 社区开源实践
4 前沿趋势
DATA+AI
-
AI for DB
AI帮助优化DB查询优化
-
DB for AI
在DB运行AI