这是我参与「第四届青训营 」笔记创作活动的的第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,为后续大数据程序应用打下理论基础。