大数据第一节SQL Optimizer | 青训营笔记

146 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第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算子代价 = α\alpha * row_count(CPU)+ (1 - α\alpha)size(IO)

  • 统计信息

    • Number of Distinct Value,NDV
    • Selectivity选择率
    • Cardinality基数
    • 收集方式
  • 统计信息推导规则

    Filter Selectivity:假设列之间独立,列的值均匀分布(当然,假设未必符合实际)。则 可以用概率规则去估算。

    “不同系统使用的filter有些区别”

  • 执行计划枚举

    使用贪心算法或dp选出最优的执行计划;利用剪枝(分支界限法、回溯法等)

    Shuffle?

听课过程中的疑问

由于对数据库/大数据的场景不熟悉,不知道性能的掣肘在哪,也便对优化的过程缺乏更深的理解。

因此,课后需重点补充:SQL处理流程、Optimizer、执行计划(logic/physical)、执行计划的每个节点的底层实现(如JOIN)等。