4

postgresqlに挿入するのに必要な200万のデータがあります。しかし、パフォーマンスは低くなっています。大きなトランザクションを小さなトランザクションに分割することで、高性能のインサーターを実現できますか(実際、これは実行したくありません)。または、他に賢明な解決策はありますか?

4

3 に答える 3

5

いいえ、より高速にするための主なアイデアは、1 つのトランザクションですべての挿入を行うことです。複数のトランザクション、またはトランザクションを使用しない場合は、はるかに遅くなります。

さらに高速なコピーを使用してみてください: http://www.postgresql.org/docs/9.1/static/sql-copy.html

本当に挿入を使用する必要がある場合は、このテーブルのすべてのインデックスを削除し、データのロード後にそれらを作成することもできます。

これも興味深いかもしれません: http://www.postgresql.org/docs/9.1/static/populate.html

于 2012-07-04T07:52:06.590 に答える
5

パフォーマンスを改善するために可能な方法:

  1. コマンドを使用しCOPYます。
  2. isolation levelデータが結果に対処できる場合は、トランザクションの を減らしてみてください。
  3. PostgreSQL サーバーの構成を微調整します。デフォルトのメモリ制限は非常に低く、サーバーにギガバイトの空きメモリがある場合でもディスク トラッシングが発生します。
  4. ディスク バリア (ファイル システムnobarrierのフラグなど) をオフにするか、PostgreSQL サーバーをオフにします。警告:これは通常安全ではありませんが、パフォーマンスが大幅に向上します。ext4fsync
  5. データを挿入する前に、テーブル内のすべてのインデックスを削除してください。一部のインデックスでは、行が追加されている間、最新の状態を維持するためにかなりの作業が必要です。PostgreSQL は、挿入プロセスと並行してインデックスを継続的に更新する代わりに、最終的により高速にインデックスを作成できる場合があります。残念ながら、現在のインデックスを「保存」し、後で同じインデックスを復元/作成する簡単な方法はありません。

挿入ジョブを一連の小さなトランザクションに分割すると、並列トランザクションのデータ依存性の問題のためにトランザクションを再試行する必要がある場合にのみ役立ちます。トランザクションが最初の試行で成功した場合、それをいくつかの小さなトランザクションに分割して順次実行すると、パフォーマンスが低下するだけです。

于 2013-11-18T06:24:32.837 に答える