SQL 查询优化器浅析 | 青训营笔记

299 阅读3分钟

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

本人研 0 大数据小白一枚,即将接手大数据相关项目,从今天开始认真学习,用笔记记录自己课前、课中和课后的收获。

1.课前预习

1.1 K8S

发展历程:虚拟机 -> 容器技术(Docker 是应用容器引擎) -> 容器编排技术(K8S 就是基于容器的集群管理平台)

参考文档:【详谈】一文带你认识 Docker 与 k8s

1.2 关系代数

集合操作、选择、投影和连接。

参考文档:关系代数

1.3 编译原理

  • 词法分析:源程序 -> 单词(Token)
  • 语法分析:单词 -> 短语(AST)
  • 抽象语法树:在语法分析过程中产生的二叉树,由于可能忽略一些多余的(例如括号)代码,抽象语法树不是 100% 与源码匹配的,它不代表真实语法中的每个细节(抽象二字的来源)。 参考文档:抽象语法树(AST)入门

1.4 SQL 执行计划

SQL整体执行流程图:Spark SQL底层执行流程详解

image.png

2.课堂笔记

2.1 SQL 处理流程

  1. Parser:SQL --> AST
  2. Analyzer:AST --> Logical Plan
  3. Optimizer:Logical Plan --> Physical Plan
  4. Executor:执行 Physical Plan

2.2 查询优化(Optimizer)

2.2.1 目标

找到一个正确且执行代价最小的物理执行计划。

2.2.2 分类

  • 按遍历计划树的方向分为:Top-down Optimizer 和 Bottom-up Optimizer
  • 按基于内容分为:Rule-based Optimizer(RBO)和 Cost-based Optimizer(CBO)

2.2.3 RBO

RBO 基于经验归纳得到的优化规则,主要有列裁剪、谓词下推、传递闭包和 Runtime Filter。

优点:实现简单,优化速度快。

缺点:不保证得到最优的执行计划。

2.2.4 CBO

CBO 使用代价模型和统计信息估算执行计划的代价。

CBO 使用贪心或动态规划寻找最优执行计划。

2.3 Apache Calcite

  • Apache Calcite 是大数据领域很流行的查询优化器。
  • Apache Calcite RBO 定义了许多优化规则,使用pattern匹配子树,执行等价变换。
  • Apache Calcite CBO 基于 Volcano/Cascade 框架。
  • Volcano/Cascade 的精髓: Memo、动态规划、剪枝。

2.4 前沿趋势

  • 大数据创业如火如荼,SQL 查询优化器仍然是必不可少的一个重要组件。
  • 引擎架构的进化、云原生、湖仓一体等对 SQL 查询优化器有新的要求和挑战。
  • AI 加持,学习型查询优化器在不断进化。

3. 学习心得

3.1 湖仓一体

  • 数据仓库一般是按照事先定义的模型将原始数据转化为结构化数据进行存储。
  • 数据湖则能存储各种类型的原始数据。
  • 湖仓一体就是要结合二者的优势为一体。

参考文档:数据湖 VS 数据仓库之争?阿里提出大数据架构新概念:湖仓一体

3.2 一个研究方向

AI + SQL Optimizer

SQL Optimizer 作为一个影响大数据场景下查询性能的关键点,还可以不断发展,与 AI 结合也是不可避免的一个研究趋势。