了解postgresql中的位图索引

时间:2015-10-13 10:44:27

标签: sql postgresql indexing bitmap

PostgreSQL 9.4

我刚遇到名为Bitmap Index Scan的节点,并提到了in this post所谓的底层位图数据结构的概念。据我所知,PostgreSQL不支持创建位图索引。

问题: 因此,每当我们需要使用位图数据结构来执行Bitmap Index Scan时,我们需要先构建它,或者PostgreSQL创建它在构造btree索引期间,并在表更改时重建它?

2 个答案:

答案 0 :(得分:28)

为每个查询动态创建页面位图。它不会被缓存或重用,并在位图索引扫描结束时被丢弃。

提前创建页面位图没有意义,因为其内容取决于查询谓词

假设您正在搜索x=1 and y=2。您在xy上拥有b树索引。 PostgreSQL不会将xy合并到位图中,然后搜索位图。它会扫描索引x以查找包含x=1的所有页面的页面地址,并生成可能包含x=1的页面为真的位图。然后,它会扫描y,查找y可能等于2的页面地址,并从中创建位图。然后它和它们进行对比以找到x=1y=2都可能为真的页面。最后,它会自动扫描表格,只读取可能包含候选值的页面,读取每个页面并仅保留x=1 and y=2所在的行。

现在,如果您正在寻找类似缓存的预构建位图索引,PostgreSQL 9.5中会出现这样的情况:BRIN indexes。它们适用于非常大的表,并提供了一种查找可以跳过的表范围的方法,因为它们已知不包含所需的值。

答案 1 :(得分:2)

数据页的位图是根据需要(每个查询)从索引或更多索引创建的。当索引返回的行数少于行数时,或者在同一关系上使用两个或多个索引时使用它。位图的内容控制应处理哪些页面以及应跳过哪些页面。

此扫描方法的基本要求是表上的现有索引。