SQL Optimizer解析 | 青训营笔记

141 阅读3分钟

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

课程目录

1. 大数据体系和SQL

2. 常见的查询优化器

3. 社区开源实践

4. 前沿趋势

1.大数据体系和SQL

1.1 大数据体系

image.png

1.2 SQL的处理流程

image.png

1.2.1 Parser

  • 词法分析
  • 语法分析

1.2.2 Analyzer和Logical Plan

  • Analyzer:检查并绑定元信息
  • Logical Plan:逻辑地描述SQL对应的分步骤计算操作

1.2.3 查询优化

  • 目标:找一个正确且执行代价最小的物理执行计划

1.2.4 Physical Plan和Executor

Plan Fragment:执行计划子树

  • 目标:最小化网络数据传输

Execuyor

  • 单机并行
  • 多机并行(相同实例读取不同数据)

2.常见的查询优化器

2.1 查询优化器分类

分类法

遍历树

  • Top-down OPptimizer
  • Bottom-up Optimizer

根据优化方法

  • RBO
  • CBO

2.2 RBO

2.2.1 RBO-关系代数

等价变换:结合律、交换律、传递性

  • Select
  • join(交换数据不影响查询结果)

2.2.2 RBO-优化规则

  • 优化I/O
  • 优化网络
  • 优化CPU内存

例:

SELECT pv.sitreld,user.name
FROM pv JOIN user
ON pv.siteld = user.siteld AND pv.userld = user.id
WHERE user.siteld > 123;

2.2.3 RBO-列裁剪

2.2.4 RBO-谓词下推

where中的表达式称为谓词

2.2.5 RBO-传递闭包

根据表达式的等价关系和过滤条件可以得出新的过滤条件

2.2.6 RBO-Runtime Filter

  • min-max
  • in-list(缺点:集合个数多,网络开销大)
  • bloom filter

RBO小结

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

2.3 CBO

执行流程

graph LR
统计信息+推导规则 --> 计算算子代价 --> 计算执行计划代价 --> 执行计划枚举

2.3.1 CBO-统计信息

统计信息分类

  1. 原始表统计信息
  2. 推导统计信息
  • 选择率(selectivity)
  • 基数(cardinality)

统计信息的收集方式

  1. 在DDL里指定需要收集的统计信息,数据库会在数据写入时收集或者更新统计信息。
  2. 手动执行explain analyze statement,触发数据库收集或者更新统计信息。
  3. 动态采样。

统计信息推导规则

假设列和列之间是独立的,列的值是均匀分布的

  • AND条件
  • OR条件
  • NOT条件
  • 等于条件
  • 小于条件

2.3.2 CBO-执行计划枚举

CBO效果-TPC-DS Q25

TPC-DS开启/关闭CBO性能对比

image.png

小结

  • RBO实现简单,优化速度快,但不保证能得到最优的执行计划
  • CBO使用代价模型和统计信息估算执行计划的代价,同时使用贪心或者动态规划算法寻找最有执行计划

3.社区开源实践

3.1 Apache Calcite概览

统一的SQL查询引擎

  • 框架图

image.png

3.2 Calcite RBO

HepPlanner

四种匹配规则

  • ARBITRARY/DEPTH_FIRST:深度优先
  • TOP_DOWN:拓扑顺序
  • BOTTOM_UP:与TOP_DOWN相反

3.3 Calcite CBO

VolcanoPlanner

  • 基于Volcano/Cascade框架
  • Group winner:目前的最优计划 剪枝:减少搜索空间

4.前沿趋势

概览

对SQL优化器新要求

  • 引擎架构的进化

  • Cloud云原生

  • 湖仓一体

  • DATA+AI

  • AI4DB
  • DB4AI

本次课程个人总结

SQL Optimizer解析.jpg

思考题 谓词下推的条件

谓词下推的原理是将过滤表达式尽可能移动至靠近数据源的位置,以使真正执行时能直接跳过无关的数据。

1. Left outer Join & Right outer Join

当过滤条件写在where且保留表的字段时可以谓词下推,反之不可,当过滤条件写在on且非保留表的字段时,可以谓词下推,反之不可。

保留表字段(left的左表)非保留表字段(left的右表)
where可以不可以
on不可以可以

2. Full outer Join

  • 如果不开启cbo,写在on后面,还是where后面,都不会谓词下推
  • 如果开启了cbo,写在where可以谓词下推,写在on不可以谓词下推

3. Inner Join

Inner Join不管有没有开启cbo,不管写在on后面还是where后面,都会进行谓词下推。