SQL Optimizer 解析 | 青训营笔记

164 阅读4分钟

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

课程内容

01 大数据体系

1.1 大数据体系

为什么先介绍SQL?

SQL简单,作为大数据框架对外提供统一接口。

One SQL rules big data all

1.2 SQL处理流程

1.2.1 parser

  • 词法分析

如Flex

  • 语法分析

如Bison

  • parser的实现

parser的实现包括词法分析和语法分析。(eg.分布式计算系统实现项目中会涉及到)

1.2.1 Analyzer

left-deep-tree

对于JOIN算子,右边必须是一个表(SCAN算子)

1.2.3 查询优化-Optimizer和Executor

MySQL和PGSQL这种单机数据库对查询优化依赖不是很大。

大数据场景查询SQL很复杂,可能几千行SQL,有大量的Join操作,数据量很大,对查询优化依赖很大。

  • 分布式场景下,优化后的逻辑计划图进行拆分,划分为Fragment或者Segment,分配到Node结点,每个结点分到执行计划一部分,得到一个分布式计划划分树。
  • 拆分Fragments的目标是减小Node之间的IO(网络数据传输)(利用数据的物理分布,保证每个结点只读本地的数据)。
  • Node之间执行计划的连接是通过Shuffle算子,一边发送,一边接收。不同Fragment之间的箭头。
  • 并行执行:单机并行和多机并行。多机并行:本例中,同一个Fragemnt1有多个实例,读同一张表,Node1和Node2读取weblog表不同的数据达到并行。

1.2.4 小结

02 常见的查询优化器

2.1 查询优化器的分类

2.2 RBO的原理 基于规则的

2.2.1 关系代数

2.2.2 优化实例

  • 列裁剪(减少数据的列)

  • 谓词下推(减少数据的行)

  • 创造新的过滤

  • 高级的优化过滤

Runtime Filter: min-max(传给一个范围,如果范围过大且扫描数据集中不太好了), in-list(集合,如果集合元素个数很多就不太行了), bloom filter(集合固定大小,给定一个数,判断它在不在,扫描一次查一次)

2.2.3 小结

2.3 CBO的原理 基于代价的

2.3.1 统计信息

  • 统计信息收集方式
    • 方式一doris系统的语法

  • 中间统计信息的推导

  • 统计信息的问题
    • 属性之间不是独立分布的选择率

2.3.2 执行计划枚举

  • 求解子问题的局部最优解达到全局的最优解

  • spark的优化例子

2.3.3 小结

2.2 总结

03 社区开源实践

3.1 查询优化器在社区的开源实践

3.2 Apache Calcite

\

3.3 小结

04 前沿

4.1 SQL引擎的前沿趋势

4.2 AI和DB结合

  • AI4DB
  • DB4AI

感觉会是一个很有趣的领域,以后自己可以尝试研究一下。

  • 想起来去年12月份参加的学院做数据库系统的CP老师的讲座,现在回想起来才意识到AI4DB早就在做,牛!

此处为语雀内容卡片,点击链接查看:www.yuque.com/coderzhacai…

4.3 小结

\

05 总结

5.1 个人小结

  1. 了解了SQL处理的流程,先经过parser解析生成AST,AST经过Analyzer阶段生成逻辑计划图,下一步是Optimizer阶段,生成物理计划图,也是最重要的一步。最后是执行过程。SQL的优化,可以分为基于规则的、基于代价的。这些概念在数据库系统概念的课本也介绍过,但是描述过于概念化,缺少图文以及相关实例介绍,以至于在学习这个的时候没明白,今天老师通过详细的流程介绍对这些概念理解的更加清晰。
  2. 了解了查询优化器的应用的前沿动态,虽然这部分比较底层,但是还是可以知道RBO、CBO在各种查询优化器中得到应用。
  3. SQL引擎的的几个前沿优势,拓宽我的眼界,同时对未来的学习方向和就业方向也有了一定的启发。对我这种SQL BOY,了解一些深度学习,了解一些数据治理和数据中台的内容,打算学习Go,k8s,入门云原生,基于SQL以后说不定也大有可为,DB4AI看上去值得去学习研究一下。