SQL Optimizer 解析(下)|青训营笔记

105 阅读4分钟

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

前言

我将SQL Optimizer解析课程内容分成两部分记录以便消化理解。

CBO

使用一个模型估算执行计划的代价。选择代价最小的执行计划

概念

  • 使用一个模型估算执行计划的代价,选择代价最小的执行计划 执行计划的代价等于所有算子的执行代价之和 通过RBO得到(所有)可能的等价执行计划
  • 算子代价:CPU,内存,磁盘I/O,网络I/O等代价
graph TD
统计信息推导规则 --> 计算算子代价-->计算执行计划代价-->执行计划枚举

统计信息

  • 原始表统计信息 表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等 列级别:min、max、num nulls、num not nulls、num distinct value(NDV)、histogram等
  • 推到统计信息 选择率(selectivity):对于某一个过滤条件,查询会从表中返回大比例的数据 基数(cardinality):在查询计划中常指算子需要处理的行数

统计信息的收集方式

-在DDL里指定需要收集的统计信息,数据库会在数据写入时收集或者更新统计信息

  • 手动执行explan analyze statement,触发数据库收集或者更新统计信息
  • 动态采样

统计信息推导规则

统计信息的问题

执行计划枚举

通常使用贪心算法或动态规划选出最优的执行计划

CBO效果-TPC-DS

CBD小结

  • CBD使用代价模型和统计信息估算执行计划的代价
  • CBD使用贪心算法或动态规划选出最优的执行计划
  • 在大数据场景下CBD对查询性能非常重要

小结

  • 主流RBO实现一般都有有几百条基于经验归纳得到的优化规则
  • RBO实现简单,优化速度快
  • RBO不保证得到最优的执行计划
  • CBO使用代价模型和统计信息估算执行计划的代价
  • CBD使用贪心算法或动态规划选出最优的执行计划
  • 在大数据场景下CBD对查询性能非常重要

社区开源实践

介绍查询优化器在社区的开源实践,重点介绍Apache Calcite项目

概览

Apache Calcite

  • One size fits all:统一的SQL查询引擎
  • 模块化、插件化,稳定可靠
  • 支持异构数据模型 关系型、半结构化、流式、地理空间数据
  • 内置RBO和CBO

Calcite RBO

  • HepPlanner

优化规则(Rule)

Pattern:匹配表达式子树

等价变换:得到新的表达式

内置有100+优化规则

四种匹配规则

ARBITRARY/DEPTH_FIRST:深度优化

TOP_DOWN:拓扑顺序

BOTTOM_UP:与TOP_DOWN相反

遍历所有的rule,直到没有rule可以被触发

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

  • VolcanoPlanner

基于Volcano/Cascade框架

成本最优假设

Memo:存储候选执行计划

Group:等价计划集合

Top-down动态规划搜索

应用Rule搜索候选计划

Memo

本质:AND/OR graph

共享子树减少内存开销

Group winner:目前的最优计划

剪枝(Branch-and-bound pruning):减少搜索空间

Top—down遍历:选择winner构建最优执行计划

小结

  • 主流的查询优化器都包含RBO和CBO
  • Apache Calcite是大数据领域很流行的查询优化器
  • Apache Calcite RBO定义了许多优化规则,使用pattern匹配子树,执行等价变换
  • Apache Calcite CBO基于Volcano/Cascade框架
  • Volcano/Cascade的精髓:Memo、动态规划、剪枝

前沿趋势

介绍SQL引擎的前沿趋势,重点介绍AI和DB的结合

Big Data,Big Money

概览

  • 引擎架构的进化 存储计算分离 一体化(HTAP,HSAP,HTSAP)
  • Cloud 云原生 serverless
  • 湖仓一体 Query Federation
  • DATA+AI 对SQL优化器有新的要求

DATA+AI

  • AI4DB

自配置

智能调参(OtterTune,QTune)

负载预测/调度

自诊断和自愈合:错误恢复和迁移

自优化:

统计信息估计(Learned cardinalities)

代价估计

学习型优化器

索引/试图推荐

  • DB4AI

内嵌人工智能算法(MLSQL,SQLFlow)

内嵌机器学习框架(SpearkML,Alink,dl-on-flink)

小结

  • 大数据创业如火如荼,SQL查询优化器仍然是必不可少的一个重要组件
  • 引擎架构的进化、云原生、湖仓一体等对SQL查询优化器有新的要求和挑战
  • AI加持,学习型查询优化器在不断进化

思考&总结

从四个部分由浅入深理论性的介绍了SQL Optimizer,为后续大数据程序应用打下理论基础。