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

时间:2011-07-06 06:57:11

标签: postgresql indexing sql-execution-plan

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

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

1 个答案:

答案 0 :(得分:104)

最好的解释来自from Tom Lane,这是算法的作者,除非我误会。另请参阅wikipedia article

简而言之,它有点像seq扫描。区别在于,位图索引不是访问每个磁盘页面,而是将适用的索引与AND和OR一起扫描,并且只访问它所需的磁盘页面。

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


Re:你评论中的问题......是的,就是这样。

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

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

请注意,除此之外,聚类/行顺序如何影响任一方法的相关成本。如果行以随机顺序遍布整个地方,则位图索引将更便宜。 (事实上​​,如果他们真的所有超过这个地方,seq扫描将是最便宜的,因为位图索引扫描并非没有一些开销。)