各項目に対して多くのキーが挿入される可能性がありますので、GINインデックスへの挿入は低速になることがあります。 ですので、テーブルに対する大量の挿入では、GINインデックスを削除し、大量の挿入が終わった段階で再作成することを勧めます。
GINではfastupdate
が有効である場合、このペナルティはそうでない場合よりも少なくなります。
(70.4.1を参照してください。)
しかし非常に大規模な更新では、インデックスの削除と再作成がまだ最善かもしれません。
GINインデックスの構築時間はmaintenance_work_mem
の設定に非常に敏感です。
インデックス作成時に作業メモリをより少なく使用しようとはしません。
fastupdate
が有効な既存のGINインデックスに対して挿入を繰り返す間、待機中の項目リストがgin_pending_list_limit
より大きくなると、システムはこのリストを整理します。
観測される応答時間の変動を防ぐためには、待機中リストの整理をバックグラウンド(すなわち自動バキューム)で起きるようにすることが望まれます。
フォアグラウンドでの整理処理は、gin_pending_list_limit
を大きくすること、もしくは自動バキュームをより積極的に行うことで防ぐことができます。
しかし、整理処理の閾値を大きくすることは、フォアグラウンドで整理処理が発生した時により長い時間がかかることを意味します。
gin_pending_list_limit
は格納パラメータを変更することで個々のGINインデックスに対して上書きでき、それにより各GINインデックスが自身の整理閾値を持てます。
例えば、頻繁に更新される可能性のあるGINインデックスの閾値のみを増やして、それ以外は減らすことができます。
GINインデックス開発の主な目的は、スケーラビリティが高い全文検索のサポートをPostgreSQLで作成することでした。 全文検索の結果は非常に大規模な結果セットを返します。 さらに、問い合わせが非常に高頻度な単語を持つ場合、こうした状況はよく発生しますが、大規模な結果セットは有用ですらありません。 ディスクから大量のタプルを読み、ソートすることは長い時間がかかりますので、実運用レベルでは受け入れられません。 (インデックス検索自体は非常に高速であることに注意してください。)
こうした問い合わせの実行を簡単に制御できるように、GINは返される行数に対して設定可能なソフト上限、gin_fuzzy_search_limit
設定パラメータを持ちます。
これはデフォルトでは0です(無制限を意味します)。
非0の制限が設定された場合、返されるセットは結果セット全体からランダムに選んだサブセットになります。
「ソフト」は、問い合わせとシステムの乱数ジェネレータの品質に依存して、返される結果の実際の数が指定した上限より多少異なることを意味します。
経験上、数千(例えば5000から20000)の値がうまく動作します。