了解PostgreSQL中的位图索引

24

PostgreSQL 9.4

我刚接触到称为Bitmap Index Scan的节点和所谓的底层位图数据结构的概念,这在此帖子中提到。据我所知,PostgreSQL不支持创建位图索引。

问题:那么,每当我们需要使用位图数据结构来执行Bitmap Index Scan时,我们需要首先构建它,还是PostgreSQL在构建btree索引时自动生成,并在表更改时每次重建?

2个回答

55
每次查询都会动态创建页面位图。它不会被缓存或重用,并且在位图索引扫描结束时被丢弃。
提前创建页面位图没有意义,因为其内容取决于查询谓词。
假设您正在搜索 x=1 and y=2。您在 xy 上有B-tree索引。PostgreSQL不会将xy组合成一个位图然后搜索该位图。它扫描索引x以获取所有具有x=1的页面地址,并生成可能包含x=1的页面的位图。然后,它扫描y以查找可能等于2的页面地址,并从中生成位图。然后,它进行AND运算以查找可能同时为x=1y=2的页面。最后,它扫描表本身,仅读取可能包含候选值的页面,读取每个页面并仅保留其中x=1 and y=2的行。
现在,如果你正在寻找类似于缓存的、预构建的位图索引,PostgreSQL 9.5中有这样一种东西:BRIN索引。它们适用于非常大的表,并提供了一种查找表范围的方法,因为它们已知不包含所需值,所以可以跳过这些范围。

2
数据页面的位图是根据索引或更多索引按需创建的(每个查询)。当索引返回的行数多于较少行数时,或者在同一关系上使用两个或更多索引时,它被使用。位图的内容控制哪些页面应该被处理,哪些页面应该被跳过。
这种扫描方法的基本要求是表上存在索引。

1
那么,每当我们需要执行“位图堆扫描”时,我们都需要从头开始构建结构吗? - St.Antario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接