SQL查询优化器浅析(四) | 青训营笔记

123 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第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项目

社区开源实践——概览

屏幕截图 2022-08-13 215929.png

Apache Calcite

One size fits all:统一的SQL查询引擎
模块化,插件化,稳定可靠
支持异构数据模型

关系型

半结构化

流式

地理空间数据

内置RBO和CBO

屏幕截图 2022-08-13 220246.png

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加持,学习型查询优化器在不断进化

2022-08-13 232422.png