SQL Optimizer | 青训营笔记

130 阅读3分钟

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

1. SQL Optimizer介绍

1.1 SQL Optimizer的功能

优化SQL语句,提升数据库应用的性能。

1.2 SQL的处理流程

SQL处理流程.jpg

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 框架的运行主要分四个阶段:

  1. Parse:使用 JavaCC 生成的解析器进行词法、语法分析,得到 AST;
  2. Validate:结合元数据进行校验;
  3. Optimize:将 AST 转化为逻辑执行计划(tree of relational expression),并根据特定的规则(heuristic 或 cost-baesd)进行优化;
  4. Execute:将逻辑执行计划 转化成引擎特有的执行逻辑,比如 Flink 的 DataStream。

3.3 Apache Calcite的组件

围绕运行流程,Apache Calcite最核心的框架可以拆分为四个组件:

  1. SQL Parser:将符合语法规则的 SQL 转化成 AST(Sql text → SqlNode),Calcite 提供了默认的 parser,但也可以基于 JavaCC 生成自定义的 parser;
  2. Catalog:定义记录了 SQL 的 metadata 和 namespace,方便后续的访问和校验;
  3. SQL Validator:结合 Catalog 提供的元数据校验 AST,具体的实现都在 SqlValidatorImpl 中;
  4. Query Optimizer:这块概念较多,首先需要将 AST 转化成逻辑执行计划(即 SqlNode → RelNode),其次使用 Rules 优化逻辑执行计划。

4. 总结

经过本次青训营SQL Optimizer课程的学习,让我了解到了优化器在数据库应用程序中所起到的巨大作用,了解到了行业流行的查询优化器。

本次笔记对部分学习内容进行了简单整理,第一部分介绍了SQL Optimizer的功能和处理流程;第二部分介绍了常见的查询优化器;第三部分介绍了Apache Calcite。