web-dev-qa-db-ja.com

更新が非常に少なく、挿入が多いインデックスメソッド

* pg_trgm *拡張子の付いたPostgresql9.1を使用しています。テキストベースのフィールドにインデックスを作成する必要があります。全文検索は必要ありません。検索にはILIKEクエリを使用します。

私が使用します pg_trgmですが、ginおよびGistインデックスの経験はあまりありません。 INSERTステートメントは多数(1日あたり約15000)、UPDATEステートメントはごくわずか(1週間に1つか2つ)になります。

そのようなテーブルのginインデックスのインデックス更新オーバーヘッドはどうなりますか?または、Gistの方が適していますか?

3
FallenAngel

Pg_trgmモジュールのマニュアルには、質問に対するアドバイスがいくつかあります ここ

経験則として、GINインデックスはGistインデックスよりも検索が高速ですが、構築または更新には時間がかかります。したがって、GINは静的データに、Gistは頻繁に更新されるデータに適しています。

FASTUPDATE GINインデックスの機能(Postgres 8.4で導入され、デフォルトでON)は、君は。 INSERT(およびUPDATE)は保留リストに格納され、後の一括操作でVACUUMによってインデックスに統合されます。 GINの直接メンテナンスは、特に多くのインデックス可能な要素、つまり多くの単語を含む列の場合、コストがかかる傾向があるため、これらの操作が大幅に高速化されます。

こちらのマニュアルにあるGINとGistの基本的なアドバイス
特に、行が大きく、まとめて挿入する場合は、 work_mem設定

非常に大きな負荷(テーブルの大部分)の場合、インデックスを削除して後で再作成するのにお金がかかる場合があります。
1日で15,000行が広がっていますが、まったく問題にはならないはずです。

最後に、全文検索セクションに GINとGistのパフォーマンスに関する章全体 があります。一般的に適用されます。これを読む。

その要点(しゃれは意図されていません):GINはかなり大きく、維持するのに費用がかかりますが、ほとんどのルックアップでは高速です( pg_trgmには特別な例外が適用されます )。 FASTUPDATE書き込みの追加は、適度にコストがかかるだけなので。

6