这是我参与「第四届青训营 」笔记创作活动的第4天
常见的查询优化器——介绍查询优化器的分类,重点介绍RBO和CBO的原理(续)
CBO
统计信息推导规则
假设列和列之间是相互的,列的值是均匀分布
Filter Selectivity
AND条件:fs(a AND b) = fs(a) * fs(b)
OR条件:fs(a OR b) = fs(a) + fs(b) - (fs(a) * fs(b))
NOT条件:fs(NOT a) = 1.0 - fs(a)
等于条件(x = literal)
literal < min && literal > max : 0
1 / NDV
小于条件(x < literal)
literal < min : 0
literal > max : 1
(literal - min) / (max - min)
执行计划枚举
单表扫描:索引扫描(随机I/O) vs 全表扫描(顺序I/O)
如果查询的数据分布非常不均衡,索引扫描可能不如全表扫描
Join的实现:Hash Join vs SortMerge Join
两表Hash Join:用小表构建哈希表——如何识别小麦?
多表Join:
那种连接顺序是最优的?
是否要对每种组合都探索?
N个表连接,仅仅是left-deep tree就有差不多N!种连接顺序
e.g.N = 10 -> 总共3628800个连接顺序
通常使用贪心算法或者动态规划选出最优的执行计划
CBO效果:开启后:
减少了90%的Shuffle数据量
3.4倍的加速比
CBO小结:
CBO使用代价模型和统计信息估算执行计划的代价
CBO使用贪心算法或者动态规划算法寻找最优执行计划
在大数据场景下CBO对查询性能非常重要
小结:
主流RBO实现一般都有几百条基于经验归纳得到的优化规则
RBO实现简单,优化速度快
RBO不保证得到最优的执行计划
CBO使用代价模型和统计信息估算执行计划的代价
CBO使用贪心或者动态规划算法寻找最优执行计划
大数据场景下CBO对查询性能非常重要
社区开源实践——重点介绍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可以被触发
优化速度快,实现简单,但是不保证最优
Calcite CBO
VolcanoPlanner
基于Volcano/Cascade框架
成本最优假设
Memo:存储候选执行计划
Group:等价计划集合
Top-down动态规划搜索
应用Rule搜索候选计划
Memo:
本质:AND/OR graph
共享子树减少内存开销
Group winner:目前的最优计划
剪枝(Branch-and-bound pruning):减少搜索空间
可行的Aggregate
总的cost = 500
自己的cost = 150
孩子节点cost上限 = 350
Top-down遍历:选择winner构建最优执行计划
小结
主流的查询优化器都包含RBO和CBO
Apache Calcite 是大数据领域很流行的查询优化器
Apache Calcite RBO定义了许多优化规则,使用pattern匹配子树,执行等价变换
Apache CalciteCBO基于Volcano/Cascade框架
Volcano/Cascade的精髓:Memo、动态规划、剪枝
前沿趋势——介绍SQL引擎的前沿趋势,重点介绍AI和DB的结合
前沿趋势—概览
对SQL优化器有新的要求
引擎建构的进化
存储计算分离
一体化(HTAP,HSAP,HTSAP)
Cloud
云原生
serverless
湖仓一体
Query Federation
DATA + AI
DATA + AI
AI4DB
自配置
智能调参(OtterTune,QTune)
负载预测/调度
自诊断的自愈合:错误恢复和迁移
自优化:
统计信息估计(Learned cardinalities)
代价估计
学习型优化器(IBM DB2 LEO)
索引/视图推荐
DB4AI
内嵌人工智能算法(MLSQL,SQLFlow)
内嵌机器学习框架(SparkML,Alink,dl-on-flink)
小结
大数据创业如火如荼,SQL查询优化器仍然是必不可少的一个重要组件
引擎架构的进化、云原生、湖仓一体等对SQL查询优化器有新的要求和挑战
AI加持,学习型查询优化器在不断进化