SQL 查询优化器 | 青训营笔记

199 阅读4分钟

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

SQL查询优化器思维导图 SQL查询优化器.png

课程目录

  1. 大数据体系和SQL
  2. 常见的查询优化器
  3. 社区开源实践
  4. 前沿趋势

1.1 SQL分析引擎

image.png

1.2 SQL的处理流程

image.png

parser(SQL解析器)

  • 词法分析:拆分字符串,得到关键词、数值常量、字符串常量,运算符等token
  • 语法分析:将一些列token组成一个AST

Analyzer

  • 检查SQL的合法性:如min、max的输入是数值
  • AST——>Logical Plan

Logical Plan:逻辑地描述SQL对应的分步骤计算操作

计算操作:算子(如:Join,Scan)

Optimizer

  • 目标:正确且执行代价最小的物理执行计划
  • SQL越复杂,Join的表越多,数据量越大查询优化的意义越大

Executor

  • 目标:最小化的网络数据传输
  • 分布式:最好本地读取数据(利用数据亲和性)

2.1 常见的查询优化器

  • Top-down Optimizer
    • 从上往下遍历计划树,找到完整的最优执行计划
  • Bottom-up Optimizer
    • 从下往上遍历计划树,找到完整的执行计划
  • RBO
    • 根据关系代数等价语义(交换律,结合律,传递性),重写查询。
    • 会访问表的元信息,不会涉及具体表数据。
  • CBO
    • 使用一个模型估算执行计划的代价,选择代价最小的执行计划

2.2 RBO:基于规则的优化

  • 列裁剪:select要的列,即去掉不需要查找的列
  • 谓词下推:where里面的表达式即称为谓词,可以减少计算的开销(提前过滤)
  • 传递闭包:可以从join的连接条件和where的过滤条件推导出新的过滤条件,可以进行谓词下推
  • Runtime Filter:min-max filter,in-list filter,bloom filter

min-max filter:[min,max]——数据的大小范围

  • 缺点:范围需要很紧密
  • 如范围1-100w,然后大部分都是1-100,小部分是100-100w,这样过滤效果不是很好

in-list filter:如果join右边的值很少,就可以用一个list来标识过滤条件

  • 缺点:右边集合的个数过多,若有100w个,把100w传输给左边的join,其中的IO也不可忽视

bloom filter:大小不随集合大小改变,固定大小

  • 给其一个数,能判断是否在集合中,如果判断其不在,则不在;如果判断其在,则可能在。构建hash表的时候也会构建一个bloom filter。然后传给join的左边,再去扫描表

优点:实现简单,优化速度快

缺点: 不能保证最优执行计划

2.3 CBO:基于代价的优化

  • 使用模型估计执行计划的代价,选其最小
  • 通常使用动态规划或者贪心算法,选择最优的执行计划

2.3.1 统计信息

原始表统计信息

  • 表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等
  • 列级别:min、max、num nulls、num、not nulls、num、distinct value(NDV)、histogram 等

推导统计信息

  • 选择率(selectivity) :对于某一个过滤条件,查询会从表中返回多大比例的数据(返回数据的比例)
  • 基数(cardinality) :基本含义是表的 unique 行数,在查询计划中常指算子需要处理的行数

统计信息收集方式:

  • DDL
    • 写入数据库时,实时收集统计信息
    • 缺点:更新数据会变慢
  • 手动执行
    • 手动触发需要收集的字段
    • 如:Analyze table table_name Compute Statistics For columns col1,col2···
    • 缺点:不够及时,数据容易过时(旧)
  • 动态采样
    • select count(*) from table_name
    • 选择表的某些数据来估算整张表的数据,可以统计表的行数,如count(*)计算出行数

3 社区开源实践

3.1 Apache Calcite:流行的查询优化器

  • 统一的SQL查询引擎,可对SQL进行解析,可以对接不同的数据处理系统(hive、flink等)
  • 模块化、插件化、稳定可靠
  • 支持异构数据模型
  • 内置 RBO 和 CBO

3.2 RBO:HepPlanner

优化规则:

  • pattern :匹配表达式子树
  • 等价变换:得到新的表达式

优化规则:遍历匹配表达式子树,通过等价变换得到新的表达式,遍历完即任务优化结束

优化速度快,实现简单,但是不保证最优

3.3 CBO:VolcanoPlanner

  • 基于Volcano/Cascade框架
  • 成本最优假设
  • Memo:存候选执行计划
    • 剪枝:减少搜索空间
  • 会top-down遍历:选择最优执行计划

4 前沿趋势

前沿趋势-概览 image.png

DATA + AI:主要分为AI4DB or DB4AI 2种

总结与思考: 听了SQL查询优化器浅析课程,我对大数据以及SQL有了更深一层的认识,以及认识到了查询优化器对于大数据场景的重要性,对于RBO,CBO都有各自的优缺点,一般情况下两者也都会用到。特别是对于Apache Calcite,让我更清晰地了解了SQL查询优化器的原理,如基于Volcano/Cascade框架的CBO,其精髓在与Memo、动态规划还有剪枝,可以用于减少搜索空间,这些都是为了提高优化的性能。