0

它清楚地说明了位图索引如何与两个可能的值(性别:男性和女性)一起工作。但是如何使用 3 个或更多值呢?谁能解释它在 postgresql 中是如何工作的?

4

1 回答 1

2

PostgreSQL 没有位图索引,它可以对常规的 B 树索引进行位图索引扫描。

为此,索引列(或列)可以具有多少值并不重要。

这是它的工作原理:

  • 扫描索引以查找搜索条件。

  • PostgreSQL 不是为找到的每一行访问表,而是构建一个位图。该位图通常每个表行有一位,并且行按物理地址 ( ctid) 顺序排序。该位的值表示该行是否匹配搜索条件(与索引列的值范围无关)。

    如果work_mem太小而无法包含每行一位的位图,则 PostgreSQL 会降级为每 8KB 页存储一位。这在输出中显示为“有损”条目,EXPLAIN (ANALYZE)并将导致在下一步影响性能的误报命中。

  • 在第二步,位图堆扫描中,PostgreSQL 访问表并获取(并在必要时重新检查)位图中显示命中的所有行。

位图索引扫描的优点是:

  • 即使选择了很多行,PostgreSQL 也只需要访问每个表块一次,并且这些行是按物理顺序访问的。

  • 在扫描表之前,可以将同一表上的多个位图索引扫描与“位图 AND”或“位图 OR”组合。如果每个条件单独的选择性不足以保证索引扫描,这可以有效地处理ORs 并将多个条件组合在一起。AND

于 2019-11-30T11:05:53.407 回答