PostgreSQL 9.4
我刚遇到名为Bitmap Index Scan
的节点,并提到了in this post所谓的底层位图数据结构的概念。据我所知,PostgreSQL
不支持创建位图索引。
问题: 因此,每当我们需要使用位图数据结构来执行Bitmap Index Scan
时,我们需要先构建它,或者PostgreSQL创建它在构造btree
索引期间,并在表更改时重建它?
答案 0 :(得分:28)
为每个查询动态创建页面位图。它不会被缓存或重用,并在位图索引扫描结束时被丢弃。
提前创建页面位图没有意义,因为其内容取决于查询谓词。
假设您正在搜索x=1 and y=2
。您在x
和y
上拥有b树索引。 PostgreSQL不会将x
和y
合并到位图中,然后搜索位图。它会扫描索引x
以查找包含x=1
的所有页面的页面地址,并生成可能包含x=1
的页面为真的位图。然后,它会扫描y
,查找y
可能等于2
的页面地址,并从中创建位图。然后它和它们进行对比以找到x=1
和y=2
都可能为真的页面。最后,它会自动扫描表格,只读取可能包含候选值的页面,读取每个页面并仅保留x=1 and y=2
所在的行。
现在,如果您正在寻找类似缓存的预构建位图索引,PostgreSQL 9.5中会出现这样的情况:BRIN indexes。它们适用于非常大的表,并提供了一种查找可以跳过的表范围的方法,因为它们已知不包含所需的值。
答案 1 :(得分:2)
数据页的位图是根据需要(每个查询)从索引或更多索引创建的。当索引返回的行数少于行数时,或者在同一关系上使用两个或多个索引时使用它。位图的内容控制应处理哪些页面以及应跳过哪些页面。
此扫描方法的基本要求是表上的现有索引。