2017-01-04 12 views
1

以前はGINインデックスを使用していませんでしたが、どのように動作するのか理解しようとしています。 私はWHERE句でSELECTクエリを実行する必要がある400万行の静的テーブルを持っています。postgresqlでginインデックスを使用する方法

今、私のテーブルは、where句で使用される "name"カラムにBツリーインデックスを持っています。

私は、GINインデックスを使用して全文検索を行うと速度が大幅に向上することを読んでいます。私はチュートリアルhereを読んでいますが、今は私が1つのテーブルしか持っていないときに使うことができるかどうかわかりません。

参加したいテーブルが複数ある場合は、フルテキスト検索が機能しますか?

私はGINインデックス作成がtsvector列で機能することを理解しています。これは私が今までやっていることです:

私は私のテーブルを変更し、1つの以上の列追加しました:TSVを:

ALTER TABLE my_table ADD COLUMN tsv tsvector; 

私はts_vector列にGINインデックスをcreatead:

CREATE INDEX tsv_idx ON my_table USING gin(to_tsvector('english', name)); 

そして私は、列を更新しました:

UPDATE my_table SET tsv = to_tsvector(name) 

は、上記の正しいですか?したがって、次のクエリを実行する場合は、

SELECT clm1, clmn2 FROM my_table WHERE name LIKE 'Ath%' ORDER BY 1 

GINインデックスを使用してどのように行うことができますか?

私はこの試みた:

SELECT clm1, clmn2 FROM my_table WHERE tvs LIKE 'Ath%' ORDER BY 1 

をしかし、私はエラーを取得する:

ERROR: operator does not exist: tsvector ~~ unknown 

は、私はここで何をしないのですか? GINの正しい使い方は何ですか?また、単一のテーブルでフルテキスト検索を適用できますか?

答えて

1

クエリを実行するには、インデックスを作成する必要があります。 tsvectorはlike検索であなたを助けません。これはプレフィックスなので、標準のbtreeが動作します。中置検索(where mycol like '%something%')を行うには、pg_trgm拡張を使用し、trigram GINインデックスを作成する必要があります。

to_tsvectorが返すものに細心の注意を払って、それがインデックスを作成しているものであることに注意してください。インデックスを作成してもクエリに何も与えられません。

+1

ありがとうございました。結局、私はGINインデックスと一緒にpg_trgm拡張を使いました。私はインデックスを次のように作成しました:CREATE INDEX my_index ON my_table USING gin(名前はCOLLATE pg_catalog。 "default" gin_trgm_ops); EXPLAINコマンドを使用すると、索引が使用されていることが確認され、速度が大幅に改善されました。 – user1919

+0

私は物事をスピードアップする他の方法を見つけようとしています。例えば。マテリアライズド・ビューまたはサーバー側のカーソル(私はpsycopg2を使用します)。 – user1919

関連する問題