这是我参与「第四届青训营 」笔记创作活动的第1天
1. SQL Optimizer介绍
1.1 SQL Optimizer的功能
优化SQL语句,提升数据库应用的性能。
1.2 SQL的处理流程
1.2.1 Parser
String -> AST (Abstruct Syntax Tree):
Parser组件的主要作用是对SQL语句进行词法分析、语法分析,继而可以实现对SQL语句的解构、加工、替换、再组装等需求。
- 词法分析:主要是拆分字符串,得到关键词、数值常量、字符串常量、运算符号等token。
- 语法分析:将token组成ASTnode,最终得到一个AST。
1.2.2 Analyzer和Logical Plan
Analyzer:
- 检查并绑定Database, Table, Column等元信息
- SQL的合法性检查
- AST -> Logical Plan
Logical Plan:
- 逻辑地描述SQL对应的分步骤计算操作
- 计算操作:算子( operator )
1.2.3 Physical Plan 和 Executor
Physical Plan: 执行计划子树
- 目标:最小化网络数据传输
- 利用上数据的物理分布(数据亲和性)
- 增加Shuffle算子
Executor
- 单机并行: cache,pipeline, SIMD
- 多机并行: 一个fragment对应多个实例
2. 常见的查询优化器
2.1 RBO(Rule-based optimizer)
- 根据关系代数等价语义,重写查询;
- 基于启发式规则;
- 会访问表的源信息(catalog),不会涉及具体的表数据(data)。
优点: 实现简单,优化速度快。
缺点: 不保证最优的执行计划。
2.2 CBO(Cost-based optimizer)
- 使用代价模型和统计信息估算执行计划的代价;
- 使用贪心或者动态规划算法寻找最优执行计划。
3. Apache Calcite
3.1 Apache Calcite介绍
- Apache Calcite是一个动态的数据管理框架, 它可以实现SQL的解析, 验证, 优化和执行。"动态"是因为Calcite是模块化和插件式的, 上述任何一个步骤在Calcite中都对应着一个相对独立的模块。用户可以选择使用其中的一个或多个模块, 也可以对任意模块进行定制化的扩展。
- Apache Calcite是当前大数据领域很流行的查询优化器。
3.2 Apache Calcite运行流程
Calcite 框架的运行主要分四个阶段:
- Parse:使用 JavaCC 生成的解析器进行词法、语法分析,得到 AST;
- Validate:结合元数据进行校验;
- Optimize:将 AST 转化为逻辑执行计划(tree of relational expression),并根据特定的规则(heuristic 或 cost-baesd)进行优化;
- Execute:将逻辑执行计划 转化成引擎特有的执行逻辑,比如 Flink 的 DataStream。
3.3 Apache Calcite的组件
围绕运行流程,Apache Calcite最核心的框架可以拆分为四个组件:
- SQL Parser:将符合语法规则的 SQL 转化成 AST(Sql text → SqlNode),Calcite 提供了默认的 parser,但也可以基于 JavaCC 生成自定义的 parser;
- Catalog:定义记录了 SQL 的 metadata 和 namespace,方便后续的访问和校验;
- SQL Validator:结合 Catalog 提供的元数据校验 AST,具体的实现都在 SqlValidatorImpl 中;
- Query Optimizer:这块概念较多,首先需要将 AST 转化成逻辑执行计划(即 SqlNode → RelNode),其次使用 Rules 优化逻辑执行计划。
4. 总结
经过本次青训营SQL Optimizer课程的学习,让我了解到了优化器在数据库应用程序中所起到的巨大作用,了解到了行业流行的查询优化器。
本次笔记对部分学习内容进行了简单整理,第一部分介绍了SQL Optimizer的功能和处理流程;第二部分介绍了常见的查询优化器;第三部分介绍了Apache Calcite。