这是我参与「第四届青训营 」笔记创作活动的第1天
课堂上首先提到了两种常用的事务型数据库(OLAP型):
MySQL和PostgreSQL:虽然国内MySQL使用的比较多,但学院派的PostgreSQL的代码更优雅,更适合学术研究。
SQL作为数据分析师、数据挖掘师大数据处理的接口
大数据体系 SQL处理的关键就是SQL在分布式环境下的优化。当对于MySQL和PostgreSQL这些单机型的数据库而言,大数据场景对SQL优化的需要更为迫切。
多个大数据计算引擎都支持 SQL 作为更高抽象层次的计算入口。
One SQL rules big data all!
SPARK 支持SQL接口、MapReduce支持SQL原语、Flink支持SQL接口、交互分析Presto等也是。
SQL 的一生
第一阶段:Parser
String(文本)àAST(抽象语法树)
涉及
词法分析阶段(拆分字符串,提取关键字,数值常量,字符串常量等token,token组成抽象语法树节点)
语法分析阶段(把词条按照定义的语法规则组装成抽象语法树结构)
实现包括:
ClickHouse的递归下降,PostgreSQL的Flex和Bison、Flink的JavaCC、Presto和Spark的Antlr。
Analyzer
检查并绑定DataBase、Table、Column的元信息。
SQL的合法性检查,比如数据库,表和列名是否存在,列的数据类型是否正确
将 AST 转换成逻辑计划树(在某些系统中这个工作由单独的 Converter 模块完成)
Logical Plan:逻辑执行计划
逻辑的描述SQL对应分步骤的计算操作(operator算子操作)
边表示数据流向,这里的计算只是一个逻辑,并不绑定算法实现
查询优化
找到正确且执行代价最小的物理执行计划
查询优化非常复杂,有很多边界Case,查询优化器很多问题都是NP的
大数据场景下多的时候几千行SQL,并且我们需要尽可能计算向数据移动,每个节点只读本地的数据,有的节点还需要执行shuffle算子,这要求查询优化器要感知数据分布、最小化网络数据传输并拆分逻辑计划到物理阶段。
查询优化器的分类
通过自顶向下和自底向上分类:
通过基于规则或者基于代价分类:
RBO 基于关系代数的等价变换,其中的等价变换包括结合律、交换律、传递性。
RBO 优化规则:
优化IO:读更少
优化网络:传输更少
CPU&Memory:执行更少
Pattern:定义了特定结构的 Operator 子树(结构)
Rule:定义了如何将其匹配的节点替换(Substitute)为新形态,从而生成新的、等价的Operator 树(原地替换)
优化器搜索过程被抽象为不断匹配 Pattern 然后应用 Rule 转换,直到没有可以匹配的 rule。
局限性:
无法解决多表连接问题
无法确定和选择最优的分布式 Join/Aggregate 执行方式
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
RBO列裁剪:从上到下扫描需要的列,减少CPU&Memory
谓词下推
谓词:Where中的表达。不同类型的join不同类型的fiter下推。
传递闭包:创造谓词下推
Runtime Fiter
构造哈希表得到集合特性:
Min-Max Filter 要求数据比较紧密
In-list Fiter
基于哈希的Bloom布隆过滤器 说一个元素不在就一定不在,说一个元素在有可能在。
Hash Join
Sort Merge Join
用小表构建哈希表 如何识别小表,选择错误的一边构建哈希表容易导致内存溢出
RBO有几百条基于经验归纳的规则,实现简单、优化速度快,但不保证得到最优的执行计划。
CBO基于启发式规则,贪心算法和动态规划选择最优执行计划,优化时候会访问表的catalog,不会涉及具体表数据。CBO在大数据场景下非常重要。
Volcano/Cascade 框架
Memo
Cascades Optimizer 在搜索的过程中,其搜索的空间是一个关系代数算子树所组成的森林,而保存这个森林的数据结构就是 Memo。Memo 中两个最基本的概念就是Expression Group(下文简称 Group)以及Group Expression(对应关系代数算子)。每个 Group 中保存的是逻辑等价的 Group Expression,而 Group Expression 的子节点是由 Group 组成。
Memo 本质是 AND/OR Graph,通过共享相同的子树减少内存开销,记录搜索过的子树的最优执行计划(winner)
已搜索完成的物理计划的代价最小值成为 Cost Upper Bound。当新的搜索分支的代价高于它时,不需继续搜索。初始 Cost Upper Bound 可由优化器根据启发式规则估算
未来展望:
现在面对的瓶颈不是网络、IO而是CPU。
如何尽可能利用CPU Cache 流水线,向量执行,榨取CPU的潜力。