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

97 阅读1分钟

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

数据库内核杂谈_技术洞察_技术趋势_大厂实践_InfoQ精选专题

Left-Deep Tree:执行计划也很直观,左边的表不断和右边的表 join 生成新的 intermediate 表(中间表),然后不断递归。在讲 join 实现的那章时,我们提到过,大部分情况下都会使用 HashJoin。如果能够使得左边的 result set 一直很小,从而建立的 Hash 表能一直存放在内存中的话,对于全部右子树的表,只要进行一次全表扫描,即可得到最终结果。因此,右子树的 table order 就不是特别影响运行时间了(因为总是得至少进行一次全表扫描的)。这种情况下,已经算是很优的执行计划了。


RBO(Rule-Based Optimizer)

列裁剪:尽早去掉不需要的列(提前select)

谓词下推: 尽早过滤数据,减少行数(下推得保证查出来的数据不变)

传递闭包:

Runtime Filter: 运行时得到数据的范围,来提前筛选数据

min-max:适用于数据分布较为均匀

in-list:适用于数据分布的范围较小

bloom filter:布隆过滤器row_count:cpu代价

size:io代价

基于概率