这是我参与「第四届青训营 」笔记创作活动的的第1天
前言
由于笔者在学校的课程中未系统学习过数据库原理,借课程笔记的整理,一方面夯实课堂内容吸收,一方面有的放矢去补充大数据课程所需的数据库等知识基础。
背景知识
课程:数据库原理(如CMU15445)、分布式系统等
技术:Hadoop/Spark/Flink等大数据组件
数据库与SQL
- 数据库 vs DBMS
- 数据仓库、数据湖(未经结构化的原始数据)、BI(Bussiness Intelligence,一种特殊的数据仓库)
- SQL:表Table(某种特定类型的结构化清单)、模式schema、列column、行row(=记录record)、主键(唯一标识某一行。主键的列需要满足四个条件:简言之,唯一性、非空、不可更改、不可重用)、外键
SQL速成:livesql.oracle.com (web网页学习,无需配置环境)
课堂笔记 - SQL查询优化器
一、 大数据体系和SQL
1. 大数据生态与体系
没有接触过大数据组件的同学,可以通过此知乎问题的几个精彩回答,对大数据生态有个直观的认识:
如何用形象的比喻描述大数据的技术生态?Hadoop、Hive、Spark 之间是什么关系? - Xiaoyu Ma的回答 - 知乎 www.zhihu.com/question/27…
One SQL rules Big Data:为了方便用户的操作,简洁的SQL作为统一的接口,大数据体系因此搭建。因此,SQL重中之重。
2. SQL的处理流程
SQL->【解析器Parser】-> AST->【分析器Analyser】->逻辑计划Logical Plan->【优化器Optimizer】->物理计划Physical Plan->【执行器Executor】
参考博客:神秘莫测的 SQL 执行计划 - 掘金 (juejin.cn) 但由于对SparkSQL不了解,看不懂orz
解析器Parser:String->AST
-
词法分析、语法分析【此处应复习编译原理相关知识】
-
实现:递归下降、Flex+Bison(PostgreSQL)、JavaCC(Flink) ...
老师:“可以选这些工具去实现parser,能力强的同学可以挑战递归下降”
分析器Analyser:AST-> Logical Plan
分析器同时实现合法性检查(类似编译器中的语义分析)。
执行计划(逻辑或物理)都以树的形式表示。 逻辑执行计划就是关系操作的执行流程,较易理解。其中,计算操作称为算子。
left-deep tree(不准确定义):要求JOIN节点的右子节点一定是SCAN。
优化器Optimizer:逻辑计划Logical Plan->物理计划Physical Plan
将在之后介绍。
执行器Executor:Physical Plan
在分布式数据库场景下,需进行节点拆分Plan ragment;目标:最小化网络数据传输
Executor:单机并行;多机并行
拓展复习:与编译原理的对比
待补
二、常见的查询优化器
分类标准1:Top-down v.s Bottom-up "可能在一个查询优化器中同时使用"
分类标准2:RBO v.s CBO
关系代数知识
(16条消息) 数据库 关系代数_季风 的博客-CSDN博客_关系代数
但这个博客的讲解相对较浅。注意补充关系运算的一些性质:结合律、交换律、传递性(将在SQL优化规则中用到)
1. RBO(Rule-based Opt)
RBO 优化规则
-
列裁剪 - 尽早裁剪列
尽早把列去掉,减少内存和OI;从上向下把需要的列传递下来。
-
谓词下推 - 尽早过滤数据
谓词predict,即表达式。
“不同类型的JOIN上面的谓词下推方式不同”。需思考。
-
传递闭包
传递性。表达式的等价关系+条件
-
Runtime Filter(min-max filter,in-list filter(值的所有集合),bloom filter)
因为JOIN 两边属性域相同,所以可以运行时先过滤右边,再过滤左边,以减少消耗。
-
缺点:
- 分布式情形下的JOIN实现:Hash or SortMerge,没有选择的明确标准
- 两表JOIN:选小表就一定好吗?未必
- 多表JOIN
- Join 消除
- 谓词合并
2. CBO(Cost-based Opt)
使用模型估算执行计划的代价。
流程:统计信息+推导规则 -> 计算算子代价 -> 计算执行计划代价 -> 执行计划枚举
如:SparkJOIN算子代价 = * row_count(CPU)+ (1 - )size(IO)
-
统计信息
- Number of Distinct Value,NDV
- Selectivity选择率
- Cardinality基数
- 收集方式
-
统计信息推导规则
Filter Selectivity:假设列之间独立,列的值均匀分布(当然,假设未必符合实际)。则 可以用概率规则去估算。
“不同系统使用的filter有些区别”
-
执行计划枚举
使用贪心算法或dp选出最优的执行计划;利用剪枝(分支界限法、回溯法等)
Shuffle?
听课过程中的疑问
由于对数据库/大数据的场景不熟悉,不知道性能的掣肘在哪,也便对优化的过程缺乏更深的理解。
因此,课后需重点补充:SQL处理流程、Optimizer、执行计划(logic/physical)、执行计划的每个节点的底层实现(如JOIN)等。