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


112

我想了解“位图堆扫描”的原理,我知道OR在条件中执行查询时经常会发生这种情况。

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

Answers:


121

最好的解释来自算法的作者汤姆·莱恩Tom Lane),除非我误会。另请参阅维基百科文章

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

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


回复:您评论中的问题...是的,就是这样。

索引扫描将一次一行地遍历行,并在必要时一次又一次地打开磁盘页(当然,某些行将保留在内存中,但您可以理解)。

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

注意,顺便说一句,聚类/行顺序如何影响这两种方法的相关成本。如果行以随机顺序遍历所有位置,则位图索引将更便宜。(而且,事实上,如果他们真的所有的地方,一个序列扫描将是最便宜的,因为一个位图索引扫描也不是没有一些开销。)


因此,“位图堆扫描”:一页不能被多次访问!但是“索引可以”:一页可以被多次访问,因为索引是按行逐行访问的。
法郎,

多次访问页面时可能涉及缓存:页面实际上是第一次从磁盘加载(慢),并且进一步的访问将访问内存中的缓存(Postgres缓存(快速)或OS缓存(更快)) 。
Matthieu

还有index-only scan在查询中仅访问索引列的时间。在这种情况下,index-only scan不需要访问堆(数据页)数据:postgresql.org/docs/12/indexes-index-only-scans.html
艾伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.