すべてのタプルを単純に挿入することによって大規模なGiSTインデックスを構築することは、インデックスタプルがインデックス全体に分散し、インデックスがキャッシュに収まらない程大規模である場合、挿入の際に大量のランダムI/Oを行わなければなりませんので、低速になりがちです。 バージョン9.2からPostgreSQLはバッファ処理に基づいてGiSTインデックスを構築するより効率的な方法をサポートします。 これは、順序付けされていないデータ群に対して必要なランダムI/O数を劇的に減らします。 十分に順序付けされたデータ群では、一度にわずかなページ数のみが新しいタプルを受け取り、そのためインデックス全体がキャッシュに収まらなくてもこれらのページがキャッシュ内に収まりますので、利点はより小さく、または利点がなくなります。
しかしバッファ付きインデックス構築は、CPUリソースを多少多く消費するpenalty
関数をより多く呼び出さなければなりません。
またバッファ付き構築で使用されるバッファは、最大作成されるインデックスと同じサイズまで、一時的にディスク容量を必要とします。
バッファ処理は作成されるインデックスの品質にも、良くも悪くも、影響を与えます。
この影響は、入力データの分布や演算子クラスの実装等、様々な要因に依存します。
デフォルトでは、インデックスのサイズがeffective_cache_sizeに達した時にGiSTインデックス構築はバッファ処理方式に切り替わります。
CREATE INDEXコマンドのbuffering
パラメータによって、手作業で有効または無効にすることができます。
デフォルトの動作は大抵の場合良好です。
しかし、入力データが順序付けされている場合、バッファ処理を無効にすることで構築が多少高速になります。