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


9

私のアプリでは、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を使用しています。


2
私が考えてインデックスが一度あたりだ更新された声明ではない一回につき、。したがって、単一のステートメントは、2つのステートメントよりも効率的です。しかし、私には
わかり

1
私は正しい質問だと思います、それは同じトランザクションでカプセル化されますか。お腹の外で、トランザクションに両方がある場合、違いはありません。
user1363989 2014

@ user1363989、私は私の質問を更新して、両方のクエリが同じトランザクションになることを示しました
cdmckay

回答:


5

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

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

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

Fabien Coelhoがここで説明しているようにFILLFACTOR、パフォーマンスに影響を与えるため、もう1つ注意する必要があるのはインデックスのインデックスです


クエリがトランザクションでバッチ処理される場合、インデックスの更新はステートメントごとに1回発生しますか?他の理由でパフォーマンスに違いはありますか?どちらの記事にもアクセスできません。再度リンクしていただけませんか。
batbrat 2017

1

現在、この点でインデックスのメンテナンスの領域に最適化の違いがあるとは思いません。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.