是否可以使用具有两个以上可能值的位图索引?
Is it possible to use bitmap index with more than two possible values?
清楚位图索引如何使用两个可能的值(性别:男性和女性)。但是怎么可能使用 3 个或更多值呢?
谁能解释一下它在 postgresql 中是如何工作的?
PostgreSQL 没有位图索引,它可以对常规 B 树索引进行位图索引扫描。
为此,索引列(或列)可以有多少个值并不重要。
这是它的工作原理:
搜索条件扫描索引
PostgreSQL 不是为找到的每一行访问 table,而是构建一个位图。此位图通常每 table 行有一位,并且行按物理地址 (ctid
) 顺序排序。该位的值表示该行是否符合搜索条件(与索引列的取值范围无关)。
如果 work_mem
太小而无法包含每行一位的位图,PostgreSQL 将降级为每 8KB 页存储一位 。这在 EXPLAIN (ANALYZE)
输出中显示为“有损”条目,将导致下一步的误报命中,从而影响性能。
在第二步中,位图堆扫描,PostgreSQL 访问 table 并获取(并在必要时重新检查)所有在位图中显示命中的行。
位图索引扫描的优点是:
即使选择了很多行,PostgreSQL 也只需要访问每个 table 块一次,并且这些行是按物理顺序访问的。
同一个table上的多个位图索引扫描可以在扫描table之前用“位图AND”或“位图OR”组合。这可以有效地处理 OR
s 并将多个条件与 AND
结合起来,如果每个条件单独的选择性不足以保证索引扫描。
清楚位图索引如何使用两个可能的值(性别:男性和女性)。但是怎么可能使用 3 个或更多值呢? 谁能解释一下它在 postgresql 中是如何工作的?
PostgreSQL 没有位图索引,它可以对常规 B 树索引进行位图索引扫描。
为此,索引列(或列)可以有多少个值并不重要。
这是它的工作原理:
搜索条件扫描索引
PostgreSQL 不是为找到的每一行访问 table,而是构建一个位图。此位图通常每 table 行有一位,并且行按物理地址 (
ctid
) 顺序排序。该位的值表示该行是否符合搜索条件(与索引列的取值范围无关)。如果
work_mem
太小而无法包含每行一位的位图,PostgreSQL 将降级为每 8KB 页存储一位 。这在EXPLAIN (ANALYZE)
输出中显示为“有损”条目,将导致下一步的误报命中,从而影响性能。在第二步中,位图堆扫描,PostgreSQL 访问 table 并获取(并在必要时重新检查)所有在位图中显示命中的行。
位图索引扫描的优点是:
即使选择了很多行,PostgreSQL 也只需要访问每个 table 块一次,并且这些行是按物理顺序访问的。
同一个table上的多个位图索引扫描可以在扫描table之前用“位图AND”或“位图OR”组合。这可以有效地处理
OR
s 并将多个条件与AND
结合起来,如果每个条件单独的选择性不足以保证索引扫描。