PostgreSQL 9.4
我正好遇到称为节点Bitmap Index Scan,并提到所谓的底层位图数据结构的概念,在这个岗位。据我所知,PostgreSQL不支持创建位图索引。
Bitmap Index Scan
PostgreSQL
问题: 因此,每当需要使用位图数据结构来执行时Bitmap Index Scan,我们需要首先构建它,或者PostgreSQL在构建btree索引期间创建它,并在表发生变化时重新构建它吗?
btree
页面位图是为每个查询动态创建的。它不会被缓存或重复使用,并在位图索引扫描结束时被丢弃。
事先创建页面位图是没有意义的,因为 它的内容取决于查询谓词 。
假设您正在搜寻x=1 and y=2。您在x和都有b树索引y。PostgreSQL不合并x并y生成位图,然后搜索该位图。它扫描索引x以查找具有的所有页面的页面地址,x=1并在其中可能包含的页面x=1为真的情况下进行位图处理。然后,它扫描以y寻找y可能相等的页面地址2,并由此生成一个位图。然后ANDS他们找到网页,都x=1和y=2可能是真实的。最后,它会扫描表自身,仅读取可能包含候选值的页面,读取每个页面并仅保留其中的行x=1 and y=2。
x=1 and y=2
x
y
x=1
2
y=2
现在,如果您正在寻找类似缓存的,预先构建的位图索引之类的东西,那么PostgreSQL 9.5中就有这样的东西:BRIN indexs。它们用于非常大的表,并提供一种查找表范围的方法,因为已知这些范围不包含所需的值,因此可以跳过这些范围。