SQL Optimizer 解析 | 青训营笔记

44 阅读2分钟

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

  1. 大数据体系和SQL 1.1 大数据体系中的SQL 大数据体系中的SQL可以总结为一句话:One SQL rules big data all. 即用SQL处理所有的大数据。大数据体系中,SQL的应用主要体现在分析引擎中。如,批示处理中的Spark、Hive、MR;实时分析的Flink;交互分析的Presto、Clickhouse、Doris等。 1.2 SQL的处理流程 image.png
  • 1.Parser:用词法分析和语法分析将SQL语句解析为抽象语法树。
  • 2.Analyzer:检查语法、绑定Database等元信息并输出逻辑计划,逻辑地描述SQL对应的分步骤计算操作。
  • 3.Optimizer:由于SQl的具体操作没有被指定,有很大的自由度,所以一个好的执行计划至关重要。而SQL越复杂,join的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能有成百上千倍。
  • 4.Executor:按照最小网络数据传输的目标把逻辑计划拆分为多个物理计划片段。
  1. 常见的查询优化器

2.1 查询优化器分类

  • Top-down Optimizer:从目标输出开始,由上往下遍历计划树,找到最优的执行计划。如SQLServer
  • Bottom-up Optimizer:从零开始,由下往上遍历计划树,找到完整的执行计划。如,PostgreSQL
  • Rule-based Optimizer:基于启发式规则,根据关系代数等价语义,重写查询。
  • Cost-based Optimizer:使用一个模型估算执行计划的代价,选择代价最小的执行计划。 几种查询优化器中最常用的就是RBO(Rule-based Optimizer)和CBO(Cost-based Optimizer),因此只展开介绍上述两种查询优化器。

2.2 RBO

  • RBO的实现一般都有几百条基于经验归纳得到的优化规则
  • 优点:实现简单,优化速度快
  • 缺点:不保证得到最优的执行计划

2.3 CBO

  • CBO使用代价模型和统计信息估算执行计划的代价
  • CBO使用贪心或动态规划算法寻找最优执行计划