我们有一个带有索引数组列的表:
CREATE TABLE mention (
id SERIAL,
phraseIds integer[],
PRIMARY KEY (id)
);
CREATE INDEX indx_mentions_phraseIds on mention USING GIN (phraseids public.gin__int_ops);
Run Code Online (Sandbox Code Playgroud)
使用此列上的"重叠"运算符的查询似乎不使用索引:
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
Run Code Online (Sandbox Code Playgroud)
是否有可能让Postgresql使用索引?或者我们应该做别的事吗?
更新:我使用'SET enable_seqscan TO off'重复测试,但索引仍未使用.
更新:我应该提到我使用9.2和intarray扩展.
更新:似乎intarray扩展是此问题的一部分.我重新创建了表而没有使用intarray扩展,并且索引按预期使用.有人知道如何让索引与intarray扩展一起使用吗?文档(http://www.postgresql.org/docs/9.2/static/intarray.html)表示支持&&的索引.
我在 PostgreSQL 9.2 中建立了一个类似的表;不同之处USING GIN (phraseids);
在于,出于某种原因,在这种情况下我似乎没有 int_ops 可用。我加载了几千行随机(ish)数据。
设置 enable_seqscan off 让 PostgreSQL 使用索引。
PostgreSQL 计算出顺序扫描的成本低于位图堆扫描的成本。顺序扫描的实际时间是位图堆扫描实际时间的 10%,但顺序扫描的总运行时间比位图堆扫描的总运行时间略多。
归档时间: |
|
查看次数: |
1741 次 |
最近记录: |