是否可以使用具有两个以上可能值的位图索引?

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”组合。这可以有效地处理 ORs 并将多个条件与 AND 结合起来,如果每个条件单独的选择性不足以保证索引扫描。