历史版本。 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 来处理。