选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 16 / 15 / 14
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页

53.5. 限制 #

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

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

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

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

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

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。