0

「INSERT INTO mytable (id, name) VALUES (?, ?)」を指定すると、JDBC の addBatch 操作で次のようなものが作成されることがわかりました。

BEGIN TRANSACTION
INSERT INTO mytable (id, name) VALUES (1, "a"); 
INSERT INTO mytable (id, name) VALUES (2, "b");
...
END TRANSACTION 

このようなステートメントと比較して: "INSERT INTO mytable (id, name) VALUES (1, "a"), (2, "b"), .. "、大規模なトランザクションはどれくらい遅くなりますか? I/O の違いは重要ですか?

4

2 に答える 2

1

PgJDBC のバッチ処理は、通常、複数値のバッチ処理ほど高速ではありませんINSERT、より便利です。

最も効率的なオプションは、PgJDBC のサポートをCOPY介してコマンドを使用することです。COPY

2 番目のオプションは、トランザクションを開き、挿入ごとに (たとえば) 10 行の多値挿入のバッチを実行し、その後に一連の単一行挿入を行って差を埋めてからコミットすることです。

PgJDBC バッチ処理は、トランザクションを開き、ステートメントを準備し、準備されたステートメントで各行を送信するデータをループし、明示的なコミットを行うよりも大幅に高速であってはなりません。現在、バッチ内で一度に複数のステートメントが実行中であるとは思いませんが、それについては確信が持てません。そうであれば、ネットワーク遅延が要因である場合、バッチが大幅に高速化されます。

試してみて、実際の影響を把握することをお勧めします。

于 2013-04-20T05:19:18.717 に答える
0

通常、バッチ処理は他の方法よりも高速です。

以下は、これが同じ接続であると仮定して、アイデアを提供するためのいくつかのケースです。

  1. 自動コミットはオンです。DB は TX ログを書き込みます。バッチの方が速いです。
  2. 自動コミットはオンです。DB は TX ログを書き込みません。同じ速度ですが、ネットワークの問題により、バッチが高速になる場合があります。
  3. 自動コミットはオフです。DB は TX ログを書き込みます。(2)も同様
  4. 自動コミットはオフです。DB はログを書き込みません。(2)も同様。

通常、クエリはログを使用して TX で実行され、ネットワークがボトルネックになるため、通常はバッチ処理の方が高速です。同じ理由で、ORM フレームワークはバッチ モードでクエリを実行する機能を提供します。

于 2013-04-20T05:04:49.633 に答える