2009-04-02 17 views
21

私のアプリケーションには、INSERT、UPDATEの一括読み込みを実行する必要があるユーティリティがあります。& DELETE操作です。私は、このシステムを呼び出すと、データがそれに供給されると、データベースにすべて追加されているか、またはデータベースに追加されていないことが保証されるように、トランザクションを作成しようとしています。PostgreSQLの最大トランザクションサイズ

ここでの境界条件は何ですか?いくつのINSERT、UPDATE & DELETEを1回のトランザクションで処理できますか?トランザクションサイズは設定可能ですか?

ご協力いただければ幸いです。

-Thanks

答えて

18

私は、トランザクションで実行することができ、作業の最大量はないと思います。データはテーブルファイルに追加され続け、最終的にトランザクションはコミットまたはロールバックされます。AIUIはこの結果をpg_clogに格納します。ロールバックすると、最終的に真空によって空きスペースが再利用されます。したがって、進行中のトランザクション作業がメモリ内に保持され、コミット時にフラッシュされるようなものではありません。

+14

これは部分的にしか正しくありません。各トランザクションの中には、トランザクション内の可視性を扱うコマンドカウンタがあります。これは、非常に大きなトランザクション(何十億ものコマンド)があると、最終的にオーバーフローする32ビットの数値です。 VACUUM、pg_clogなどは、システム内のトランザクションの総数のみを処理し、その内の1つの内部では発生しません。 –

+0

@MagnusHaganderこの32ビット番号はまだ成立しますか?この番号は64ビットに更新されていますか? – Kuberchaun

+0

はい、内部コマンドカウンタはまだ32ビットです。 –

16

私が取り組んでいるプロジェクトでは、私は20百万のINSERTを実行します。私は1回の大きな取引と1万回のINSERTで1回の取引を試みましたが、パフォーマンスはまったく同じように見えます。

のPostgreSQL 8.3

+1

システムがローカルになっていますか?私はレイテンシが要因であるシステムでこれを行うと思います。パフォーマンスは異なります。 – user2677679

0

私は仕事の最大量は、ログファイルのサイズによって制限されていると信じています。データベースはロールバックできないようにするため、トランザクション中にすべてのログ領域を消費すると、スペースやロールバックを増やすまで停止します。これは、すべてのデータベースで一般的に当てはまります。

私は、実行時間が最大2分かかる管理可能なチャンクにチャンクを入れることをお勧めします。問題が早い場合はそれを知ることができます(通常、10分後には通常1分かかる誰かがインデックスをドロップしたのですか?)

+8

これはPostgreSQLでは当てはまりません。実行中のトランザクション中にログスペースをリサイクルすることができます。アーカイブロギングを行っている場合は、明らかにアーカイブの場所にスペースが必要ですが、ローカルのトランザクションログの場合は必要ありません。 (もちろん、ディスク上のデータには実際のディスク容量が必要です)。 –

18

1つのトランザクションで約2億のコマンドを実行できます(2^31、IIRCを除いたオーバーヘッドはわずかです) 32 - commandcounterは私が思うには無署名です)。

これらのコマンドのそれぞれは、もちろん複数の行を変更できます。