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

324 阅读2分钟

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

SQL 查询优化器最常见的就是 RBO 和 CBO 两种,本篇简单记录一下 RBO(基于规则的优化)

这些规则只是经验规则,是总结出来的,甚至有时候可能反向优化(

三个优化原则

  • I/O:更少并更快地读取
  • 网络:更少并更快地传输
  • CPU和内存:更少并更快地处理

以下面这句 SQL 为例

SELECT pv.siteId, user.name
FROM pv JOIN user
ON pv.siteId = user.siteId AND pv.userId = user.Id
WHERE user.siteId > 123;

优化前的执行计划如下

image-20220822222215448

优化规则1:列裁剪

列裁剪很好理解,就是只读取需要的列

image-20220822222436596

优化规则2:谓词下推

尽早过滤掉不必要的行,减少资源占用

image-20220822222510259

优化规则3:传递闭包

表达式的等值关系 + 过滤条件 = 新的过滤条件

比如这里要进行 JOIN ,有一个等值条件,而右侧有一个过滤,所以左侧也可以进行过滤

image-20220822222600683

优化规则4:Runtime Filter

image-20220822222708047

提早过滤左边的数据,那么就能减少开销(网络、运算等)

JOIN 的时候得到右侧 JOIN 集合的一些特性(例如知道右侧 JOIN KEY 的范围),然后通过这些特性先过滤左侧的数据

  • min-max:知道了右侧的范围是 0100,那么左侧就只扫描 0100 的范围(缺点:范围必须是很紧密的,不然意义不大)
  • in-list:如右侧的值很少,就可以使用 in-list ,使用集合包含过滤(缺点:右侧集合不能太大)
  • bloom filter:通过右侧来构建,效果是给我一个数,如果说不在那就是不在,说在是有可能在

RBO 小结

这里只讲了 4 条经验规则,但一般实现都有几百条

优点是简单快速,但是缺点也很多,比如,不保证能得到最优的执行计划