这是《漫谈分布式系统》系列的第 22 篇,预计会写 30 篇左右。扫描文末二维码,关注公众号,听我娓娓道来。也欢迎转发朋友圈分享给更多人。
经验的局限性
前面两篇文章,我们介绍了大数据下的 RBO 和 CBO 这两种 SQL 查询性能优化手段。
RBO 忠于既定规则,而 CBO 更关心实际代价,从根本上来说,是两种思路完全不同的优化方式。
虽然各有侧重点,但也有共性。
CBO 虽说基于代价,但也是在几个备选计划中,再去挑选代价最小的。而备选计划也不是随机来的,通常也是基于经验挑选的。
比如常被拿来做例子的 join order,就是在以往经验中,发现 join 的顺序不同,对性能有很大影响,才做成不同的备选计划去接受评估。
从这个角度讲,广义地看,RBO 和 CBO 都是基于经验的。
只不过 CBO 给这些经验加入了一些变量,也就是各种对实际数据的统计指标。
然而,上一篇文章我们已经说过,这些统计指标是有缺点的:
统计指标的计算是需要消耗成本的,导致指标可能未及时更新,甚至根本没有指标,
有些指标需要估算,可能不准,比如 filter selectivity 是近似估算,
统计指标可能不能保证及时更新,比如数据刚更新了就被使用,而统计指标还没算完。
这