第一节:SQL 查询优化器浅析 | 青训营笔记

151 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第1天。

本节课程主要分为 4 个方面:(课中掌握) 大数据体系和 SQL; 常见的查询优化器; 查询优化器的社区开源实践; SQL 相关的前沿趋势。

一、大数据体系和SQL 大数据体系: 大数据体系是数据平台、数据采集、数据仓库、数据处理、数据分析、数据挖掘、数据应用、数据可视化、深度学习和机器学习。 SQL的优势有: 1.有 MySQL、Oracle 之类使用 SQL 作为交互语言的数据库 2.有 JDBC、ODBC 之类和各种数据库交互的标准接口 3.有大量数据科学家和数据分析师等不太会编程语言但又要使用数据的人 4.多个大数据计算引擎都支持 SQL 作为更高抽象层次的计算入口 MapReduce -> Hive SQL Spark -> Spark SQL Flink -> Flink SQL

二、常见的查询优化器

RBO、CBO,统计信息

RBO: 基于关系代数等价规则对逻辑计划进行变换 在实现上: 1.Pattern:定义了特定结构的 Operator 子树(结构) 2.Rule:定义了如何将其匹配的节点替换(Substitute)为新形态,从而生成 新 的、等价的Operator 树(原地替换) 3.优化器搜索过程被抽象为不断匹配 Pattern 然后应用 Rule 转换,直到没有 可 以匹配的 rule

RBO的局限性: 1.无法解决多表连接问题 2.无法确定和选择最优的分布式 Join/Aggregate 执行方式

CBO: 1.使用一个模型估算执行计划的代价,选择代价最小的执行计划 2.分而治之,执行计划的代价等于所有算子的执行代价之和 3.通过 RBO 得到(所有)可能的等价执行计划(非原地替换) 4.算子代价包含 CPU,cache misses,memory,disk I/O,network I/O 等代价 和算子的统计信息有关,比如输入、输出结果的行数,每行大小等。 叶子算子 scan:通过统计原始表数据得到 中间算子:根据一定的推导规则,从下层算子的统计信息推导得到 和具体的算子类型,以及算子的物理实现有关 5.使用动态规划枚举所有执行计划,选出执行代价最小的执行计划

统计信息: 1.基表统计信息 表或者分区级别: 行数、行平均大小、表在磁盘中占用了多少字节等 列级别:min、max、num nulls、num、not nulls、num、distinct value(NDV)、histogram 等 2.推导统计信息 选择率:对于某一个过滤条件,查询会从表中返回多大比例的数据 基数:基本含义是表的 unique 行数,在查询计划中常指算子需要处理的行数

三、查询优化器的社区开源实践 Volcano/Cascade 框架: Memo: Cascades Optimizer 在搜索的过程中,其搜索的空间是一个关系代数算子树 所组成的森林,而保存这个森林的数据结构就是 Memo。 Memo 中两个最基本的概念就是 Expression Group以及 Group Expression(对 应关系代数算子)。每个 Group 中保存的是逻辑等价的 Group Expression,而 Group Expression 的子节点是由 Group 组成。 Memo的本质是 AND/OR Graph,通过共享相同的子树减少内存开销,记录搜索过的子 树的最优执行计划(winner)

Branch-and-Bound Pruning 已搜索完成的物理计划的代价最小值成为 Cost Upper Bound。 当新的搜索分支的代价高于它时,不需继续搜索。 初始 Cost Upper Bound 可由优化器根据启发式规则估算。

四、SQL 相关的前沿趋势

1.储计算分离 2.HSAP, HTAP, HTSAP 3.Cloud Native, Serverless 4.数据仓库,数据湖,湖仓一体,联邦查询 5.智能化 AI4DB 自配置:智能调参、负载预测、负载调度 自诊断和自愈合:软硬件错误、错误恢复和迁移 自优化:统计信息估计、代价估计、学习型优化器,索引推荐,视图推荐 DB4AI 内嵌人工智能算法 内嵌机器学习框架