用于任何查询的数组列的 Postgres 索引类型
Postgres index type for array column for ANY queries
我有一个 Postgres table,其中有一列是字符串数组。将使用此列完成的唯一搜索将是 IS NULL
/ IS NOT NULL
和查询数组包含某些值的行(例如,'vote'=ANY(T.column)
)。
现在,我知道 GIN 索引支持 <@
运算符,它检查一个数组的元素是否包含在另一个数组中(其中 ANY
实际上是 1 的特例元素数组)。然而, seems to suggest that ANY
works fine with B-tree indexes as does Shana K's answer from 的答案(实际上她建议 <@
与他们一起工作)。
然而,Postgres docs似乎只提到了B树支持的<
、=
、<=
等。我需要什么索引来支持搜索数组列包含指定值的行的查询?
编辑: 由于发布了这两个答案,现在已经更新为不再建议 B 树索引有效。
这里有一个详细的解释,为什么 ANY
构造 右边的索引列 不能进入 GIN 索引(或任何索引,就此而言) :
- Can PostgreSQL index array columns?
但是array operators可以。参见:
- Check if value exists in Postgres array
要强制使用小 table 进行测试,您可以在当前会话中禁用(实际上是非常不鼓励)顺序扫描:
SET enable_seqscan = OFF;
参见:
- Postgres query optimization (forcing an index scan)
我有一个 Postgres table,其中有一列是字符串数组。将使用此列完成的唯一搜索将是 IS NULL
/ IS NOT NULL
和查询数组包含某些值的行(例如,'vote'=ANY(T.column)
)。
现在,我知道 GIN 索引支持 <@
运算符,它检查一个数组的元素是否包含在另一个数组中(其中 ANY
实际上是 1 的特例元素数组)。然而,ANY
works fine with B-tree indexes as does Shana K's answer from <@
与他们一起工作)。
然而,Postgres docs似乎只提到了B树支持的<
、=
、<=
等。我需要什么索引来支持搜索数组列包含指定值的行的查询?
编辑: 由于发布了这两个答案,现在已经更新为不再建议 B 树索引有效。
这里有一个详细的解释,为什么 ANY
构造 右边的索引列 不能进入 GIN 索引(或任何索引,就此而言) :
- Can PostgreSQL index array columns?
但是array operators可以。参见:
- Check if value exists in Postgres array
要强制使用小 table 进行测试,您可以在当前会话中禁用(实际上是非常不鼓励)顺序扫描:
SET enable_seqscan = OFF;
参见:
- Postgres query optimization (forcing an index scan)