SQL Optimizer初印象|青训营笔记

87 阅读2分钟

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

大数据体系与sql

大数据体系从底层基础到上层应用包含基础设施、存储系统、资源调度、分析引擎、权限管理、数据开发、业务应用等内容,本文主要涉及分析引擎这一部分。
sql的一般处理流程为:Parser、Analyzer、Optimizer、Executor,前一步的输出为后一步的输入。
1 Parser的输入为sql语句(String类型),经过词法分析、语法分析输出抽象语法树(AST),具体的实现方式包括:递归下降、Flex和Bison、JavaCC、Antlr。
2 Analyzer检查并绑定数据库、表、列等元信息,检查sql的合法性,输出逻辑计划(Logical Plan),Logical Plan逻辑地描述sql语句所对应的分布计算操作,每一个计算操作称为一个算子。
3 sql语句只声明了需要做什么,并没有制定具体的执行步骤,因此存在多种可能的实现方案,Optimizer需要尽可能找到最优的方案。
4 Executor是最终的执行步骤,执行之前需要按照最小化网络数据传输的目标把逻辑计划拆分成多个物理计划片段。Executor可分为单机并行和多机并行,单机并行时有cache、pipeline、SIMD等操作。

查询优化器

查询优化器可以分为基于规则的优化(RBO)和基于代价的优化(CBO),RBO跟据关系代数等价语义重写查询、基于启发式规则、会访问表的元信息但不会涉及具体的表数据,具体的实现包括列裁剪、谓词下推、传递闭包、运行时过滤等,其优点是实现简单且优化速度快,缺点是不保证得到最优的执行计划。CBO使用模型评估执行计划的代价,枚举出执行计划,使用贪心算法或者动态规划选择代价最小的执行计划,当执行计划过多时也可提前机型剪枝。大数据场景下,CBO对查询性能的提高非常重要。在具体的实践中,主流的查询优化器都包含RBO和CBO。