我们有一个带有索引数组列的表:
CREATE TABLE mention (
id SERIAL,
phraseIds integer[],
PRIMARY KEY (id)
);
CREATE INDEX indx_mentions_phraseIds on mention USING GIN (phraseids public.gin__int_ops);
在此列上使用“重叠”运算符的查询似乎不使用索引:
explain analyze select m.id FROM mention m WHERE m.phraseIds && ARRAY[11638,11639];
Seq Scan on mention m (cost=0.00..933723.44 rows=1404 width=4) (actual time=103.018..3751.525 rows=1101 loops=1)
Filter: (phraseids && '{11638,11639}'::integer[])
Rows Removed by Filter: 7019974
Total runtime: 3751.618 ms
是否可以让 Postgresql 使用索引?还是我们应该做点别的?
更新:我用“SET enable_seqscan TO off”重复了测试,但仍然没有使用索引。
更新:我应该提到我正在使用带有 intarray 扩展的 9.2。
更新:似乎 intarray 扩展是这个问题的一部分。我在不使用 intarray 扩展的情况下重新创建了表,并且按预期使用了索引。任何人都知道如何让索引与 intarray 扩展一起使用?文档(http://www.postgresql.org/docs/9.2/static/intarray.html)说索引支持&&。