web-dev-qa-db-ja.com

複数行挿入と複数の単一行挿入

私のアプリでは、dbとアプリの間のラウンドトリップの数を減らすために、可能な場合は複数行の挿入を行います。

でも、気になったのですが、他にメリットはありますか?たとえば、次のように複数の行が一度に挿入された場合:

insert into tbl (c1, c2) values
(v1, v2)
(v3, v4)

対:

insert into tbl (c1, c2) values (v1, v2)
insert into tbl (c1, c2) values (v3, v4)

テーブルにインデックスがありますが、最初のケースではインデックスが1回計算され、2番目のケースでは2回計算されますか?それとも、挿入ごとに常に1回ですか?両方のクエリが同じトランザクションにあると仮定します。

PostgreSQLを使用しています。

9
cdmckay

@a_horse_with_no_nameは、インデックスがステートメントごとに1回更新されるのは正しいと思います。ステートメントが実行を完了していない場合、トランザクション内にあるため、データが表示されないためです。そしてステートメントの定義は複数の値を持つことを含みます

そして、ドキュメントによると here インデックスの作成/更新は、単一のステートメントよりもバッチで効率的に機能します。

Peter Manis による、私が推奨できるさまざまなInsertメソッドのパフォーマンスに関する素晴らしい記事もあります。

もう1つ覚えておかなければならないのは、パフォーマンスに影響を与えるインデックスのFILLFACTORです Faien Coelhoがここで説明しているように

5
Benjamin

この点に関して、インデックスのメンテナンスの分野で現在最適化の違いがあるとは信じていません。

ネットワークオーバーヘッドに加えて、複数値ステートメントの他の利点は、解析、ロックなどにあります(tblのテーブルロックは最初の挿入ステートメントによって行われ、その後残りの期間にわたって維持されます)トランザクションの場合、各挿入ステートメントはロックが保持されていることを確認する必要があり、この確認は無料ではありません)

1
jjanes