↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 16 / 15 / 14
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2
历史版本。 PostgreSQL 8.4 已结束支持。 请参阅 当前版本手册.

52.5. 限制 #

GIN 不支持全索引扫描。原因在于,允许 extractValue 返回零个键,例如空字符串或空数组时就可能出现这种情况。在这种情况下,被索引值不会在索引中有任何表示。因此,GIN 无法保证扫描索引就能找到表中的每一行。

由于这一限制,当 extractQuery 返回 nkeys = 0 表示所有值都匹配查询时,GIN 会抛出一个错误。(如果查询中有多个以 AND 连接的可索引操作符,则只有当它们为 nkeys 返回的都是零时才会发生。)

操作符类可以绕过对全索引扫描的这一限制。为此,extractValue 必须为每个被索引值返回至少一个(可能是占位用的)键,而 extractQuery 必须把无限制的搜索转换为会扫描整个索引的部分匹配查询。这样做效率不高,但对于避免 LIKE 或子集包含之类操作符在边角情况下的失败,可能是必要的。

GIN 假定可索引操作符是严格的。这意味着,当值为 NULL 时,根本不会调用 extractValue(因此该值不会进入索引);当比较值为 NULL 时,也不会调用 extractQuery(而是认为该查询不可满足)。

一个可能更严重的限制是,GIN 无法处理 NULL 键 — 例如,包含 NULL 的数组只能通过忽略该 NULL 来处理。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.