SQL Optimizer 解析 | 青训营笔记

109 阅读2分钟

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

一、本次堂课笔记的内容

  • 大数据体系和SQL
  • 一些常见的查询优化器

二、知识点小结

SQL在绝大数下的分析引擎中都有接口供使用,比如在批式分析的Spark、Hive、MR中,实时分析的Filnk中、交互分析的Presto、ClickHouse、Doris中等。

1.SQL的处理流程

graph LR
0(input SQL) --> |SQL| A(Parser)
A --> |AST| B(Analyzer)
B --> |Logical Plan| C(Optimizer)
C --> |Physical Plan| D(Executor)

Parser:通过词法分析、语法分析将SQL-->AST(抽象语法树);

Analyzer:检查Table、Column以及SQL等信息的合法性,将AST-->Logical Plan(逻辑执行计划);

Optimizer:经过该查询优化过程,得到物理执行计划;

2.常见的查询优化器

查询优化器是数据库中最复杂的模块,其目标是找到正确且执行代价最小的物理执行计划。

查询优化器根据优化方法进行分类分为:Rule-based-Optimizer(RBO)、Cost-based Optimizer(CBO)。

2.1 RBO:根据关系代数等价语义,重写查询

优化规则:

  • 优化其I/O时尽可能的读更少的数据使其读更快
  • 优化其网络,使其传输的数据更少
  • 优化其CPU及内存,使其处理数据时cpu的指令数更少

优缺点

  • 优点:实现简单,优化速度快。
  • 缺点:不能保证得到最优的执行计划。

2.2 CBO:使用一个模型估算执行计划的代价,选择代价最小的执行计划。

在估算执行代价时一般会考虑的方面有:CPU、内存、磁盘I/O、网络I/O等。

估算执行代价的大致流程

graph LR
A(统计信息+推导规则) --> B(计算算子代价)
B -->  C(计算执行计划代价)
C -->  D(执行计划枚举)

三、总结

SQL在大数据中非常重要,SQL查询效率微小的提升在对大量的数据进行操作时会有着很大的提升。课程中介绍了查询优化器的分类,重点介绍RBO和CBO的优化方法及原理。虽然在课程中只介绍了RBO实现的其中四种规则,列裁剪、谓词下推、传递闭包、Runtime Filter,但主流的RBO实现一般有很多的优化规则。CBO的统计信息的推导不能一味的按照公式进行,也要根据不同的统计信息的特点选择不同的方案。执行计划的枚举在选出最优的执行计划时通常使用贪心算法或者动态规划。