【问题标题】:Is it possible to use bitmap index with more than two possible values?是否可以使用具有两个以上可能值的位图索引?
【发布时间】:2019-11-30 10:51:28
【问题描述】:

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

【问题讨论】:

标签: postgresql database-indexes bitmap-index


【解决方案1】:

PostgreSQL 没有位图索引,它可以位图索引扫描在常规的 B 树索引上。

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

这就是它的工作原理:

  • 为搜索条件扫描索引。

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

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

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

位图索引扫描的优点是:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多