SQL Optimizer | 青训营笔记

170 阅读3分钟

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

一、本堂课重点内容

image.png

二、详细知识点介绍

1、大数据体系

大数据体系中,最为核心的部分就是分析引擎,主要包含批式分析、实时分析和交互分析三个部分。其中,批式分析包括Spark、Hive和MapReduce,实时分析包括Flink,交互分析包括Presto、ClickHouse和Doris。

Snipaste_2022-07-24_17-19-24.jpg

2、SQL为什么这么重要?

  • 有连接JDBC和ODBC的标准接口;
  • 方便数据科学家和数据分析师获取想要分析的数据,不需要通过编程语言获取数据。

3、SQL是如何被执行的?

image.png

  1. Parser:解析SQL语句,将文本转化为抽象语法树AST;
  2. Analyzer:判断SQL语句是否合理(比如数据库是否存在、表和列名是否存在、列的数据类型是否正确等),并将AST转换成逻辑计划树;
  3. Optimizer(尤为关键):对SQL进行查询优化,分为RBO和CBO两种优化方式;
  4. Executor:按照Optimizer输出的物理执行计划实际执行SQL,充分利用机器资源。

4、常见的查询优化器

  • Rule-based Optimizer (RBO)
    • 根据关系代数等价语义,重写查询(本质上就是根据事先定好的规则,匹配符合条件的子树,然后对子树进行替换);
    • 基于启发式规则;
    • 会访问表的元信息,不会涉及具体的表数据。
  • Cost-based Optimizer (CBO)
    • 使用一个模型估算执行计划的代价,选择代价最小的执行计划;
    • 具体步骤为:统计信息+推导规则\rightarrow计算算子代价\rightarrow计算执行计划代价\rightarrow执行计划枚举。

5、查询优化器开源实践

Calcite项目链接:🔗Apache Calcite • Dynamic data management framework, 该项目既支持RBO,又支持CBO。其中,RBO对应的实现为HepPlanner,可以使用内置的100多种优化规则,其优点是优化速度快,实现简单,但是不保证最优。CBO对应的实现为VolcanoPlanner,最核心的部分是Memo,本质上是一个AND/OR Graph,通过共享相同的子树减少内存开销,用来记录搜索过的子树的最优执行计划。

image.png

6、相关前沿趋势

  • 存储计算分离
  • HSAP, HTAP, HTSAP
  • Cloud Native, Serverless
  • 数据仓库,数据湖,湖仓一体,联邦查询
  • 智能化
    • AI4DB:简单来说,就是通过机器学习算法和深度学习算法,优化SQL的执行效率;
    • DB4AI:让数据库更好地支持人工智能算法应用。

7、课后个人总结

本节课主要讲解了有关SQL Optimizer的相关知识和前沿趋势,本堂课的核心知识点就是SQL Optimizer的两个主要优化方向,分别是RBO和CBO。RBO的实现较为简单,优化速度快,但是优化结果可能不是最优;CBO优化效果较好,但是比较依赖推导统计信息(选择率和基数)的精确程度,因此大多数的业界实现都是RBO和CBO相结合的方式。