9

我们有一个带有索引数组列的表:

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)说索引支持&&。

4

1 回答 1

6

我在 PostgreSQL 9.2 中建立了一个类似的表;不同之处在于USING GIN (phraseids);,由于某种原因,我似乎没有 int_ops 在这种情况下可用。我加载了几千行随机(ish)数据。

设置 enable_seqscan 让 PostgreSQL 使用索引。

PostgreSQL 计算出顺序扫描的成本低于位图堆扫描的成本。顺序扫描的实际时间是位图堆扫描实际时间的 10%,但顺序扫描的总运行时间比位图堆扫描的总运行时间多一点。

于 2013-08-16T02:22:24.060 回答