查询计划中的“位图堆扫描”是什么?

我想知道“位图堆扫描”的原理,我知道这经常发生,当我在OR条件下执行查询。

谁可以解释“位图堆扫描”背后的原理?

最好的解释来自Tom Lane ,algorithm的作者,除非我错了。 另见维基百科的文章 。

总之,这有点像seq扫描。 不同之处在于,不是访问每个磁盘页面,位图索引扫描将可应用的索引与“并发”或“并发”在一起,只访问所需的磁盘页面。

这与索引扫描是不同的,索引是按顺序逐行访问的 – 这意味着磁盘页面可能会被多次访问。


回复:你评论中的问题…是的,就是这样。

索引扫描将一个一个地遍历行,一次又一次地打开磁盘页面,根据需要多次(当然有些会留在内存中,但是你明白了)。

位图索引扫描将按顺序打开磁盘页面的短列表,并抓取每一个适用的行(因此您在查询计划中看到所谓的“重新检查”)。

另外请注意,集群/行顺序如何影响相关成本。 如果行按随机顺序遍布整个位置,则位图索引将更便宜。 (事实上​​,如果他们真的到处都是,那么seq扫描将是最便宜的,因为位图索引扫描不是没有一些开销。)