这是我参与「第四届青训营 」笔记创作活动的的第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代价
基于概率