了解postgresql中的位图索引

St.*_*rio 13 sql postgresql indexing bitmap

PostgreSQL 9.4

我刚刚遇到了这个帖子中Bitmap Index Scan提到的被调用的节点和所谓的底层位图数据结构的概念.据我所知,不支持创建位图索引.PostgreSQL

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

Cra*_*ger 32

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

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

说你正在寻找x=1 and y=2.你有B树索引xy.PostgreSQL没有组合xy进入位图然后搜索位图.它扫描索引x以查找所有页面的页面地址,x=1并生成一个位图,其中可能包含的页面x=1为true.然后它会扫描y寻找y可能相等的页面地址2,从而制作一个位图.然后ANDS他们找到网页,都x=1y=2可能是真实的.最后,它会自动扫描表,只读取可能包含候选值的页面,读取每个页面并仅保留行所在的位置x=1 and y=2.

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