私たちは、インデックス付きの配列の列を持つテーブルがある:このコラムの「重複」演算子を使用してPostgres配列の重複(&&)演算子でインデックスを使用できますか?
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」でテストを繰り返しましたが、インデックスはまだ使用されていません。
アップデート:私は、9.2をintarray拡張子とともに使用していることを述べておきます。
更新:intarray拡張がこの問題の一部であるようです。私はintarray拡張子を使用せずにテーブルを再作成し、インデックスは期待どおりに使用されます。誰でも、インデックスをintarray拡張子とともに使用する方法を知っていますか?ドキュメント(http://www.postgresql.org/docs/9.2/static/intarray.html)は、インデックスは& &でサポートされていると言います。
'enable enable_seqscan TO off'を使用して、PG *がインデックスを使用できるかどうか最初に確認してください。インデックススキャンがseqスキャンより速い場合は最初に参照してください。ここに結果を投稿してください。 – MatheusOl
各行にID番号の*配列*をテーブル用に保存するのはなぜですか? –
以前はデータがMySQLにあり、データを保持するためにいくつかの別々の列(phrase0、phrase1、...)を使用しました。別のテーブルを使用するのはMySQL(両方のテーブルで何百万行も行があり、結果をソートして制限する必要があります)では非常に遅いです。 Postgres配列を使うのは良いことのようでした。 –