データベースにデータを初期投入するために、大量のテーブル挿入操作を行う必要がままあります。 ここでは、そうしたことを効率よく行うためのちょっとしたヒントとテクニックを紹介します。
自動コミットをオフにし、最後に一回だけコミットします。 (普通のSQLでは、これはBEGINを開始時に、COMMITを最後に発行することを意味します。クライアント用ライブラリの中にはこれを背後で実行するものもあります。 その場合は、要望通りにライブラリが行っているかどうかを確認しなければなりません。) 各挿入操作で別個にコミットすることを許すと、PostgreSQLはレコードを追加するたびに多くの仕事をしなければなりません。 1つのトランザクションですべての挿入を行なうことによるもう1つの利点は、1つのレコードの挿入が失敗した場合、その時点までに挿入されたすべてのレコード挿入がロールバックされることです。その結果、一部のみがロードされたデータの対処に困ることはありません。
1個のコマンドですべてのデータをロードするために一連のINSERTコマンドではなく、COPY FROM STDINを使用してください。 こうするとパーサやプランナその他のオーバーへッドを減らすことができます。 いずれにしてもこの方法では、コマンドはひとつなので、自動コミットを無効にする必要はありません。
新規に作成したテーブルをロードする時、最速の方法は、テーブルを作成し、COPYを使用した一括ロードを行い、そのテーブルに必要なインデックスを作成することです。 既存のデータに対するインデックスを作成する方が、各行がロードされる度に段階的に更新するよりも高速です。
既存のテーブルに追加しているのであれば、インデックスを削除し、テーブルをロードし、インデックスを再作成することができます。 もちろん、他のユーザから見ると、インデックスが存在しない間データベースの性能は悪化します。 また、一意性インデックスを削除する前には熟考しなければなりません。 一意性制約によるエラー検査がその期間行われないからです。