0

MS SQL テーブルに対して複数の挿入ステートメント (動的に生成) を実行する必要があるプログラムがあります。今、私は(疑似コード):

Loop
Generate Insert Statement String
SQLCommand.Text = Generated Insert Statement String
SQLCommand.Execute().
End Loop

Close Connection

セミコロンで区切られた 1 つの大きな挿入文字列を単純に作成する方が、パフォーマンス的に優れていますか。SQLCommand.Execute() ステートメントを 1 つだけ実行しますか? それとも違いはありませんか?

ありがとう!

4

6 に答える 6

4

このテクニックは役に立つかもしれません。処理されるステートメントの数が大幅に削減されます。

于 2009-06-14T15:38:14.393 に答える
3

挿入を開始する前に、トランザクションを開始する必要があります。次に、すべての挿入をサーバーに送信し、ループを終了したら、コミットする必要があります。これにより、データベースへの書き込みが大幅に削減されます。

詳細はこちら: http://msdn.microsoft.com/en-us/library/5ha4240h.aspx

于 2009-06-14T15:49:11.357 に答える
1

この段階でそれを行う選択肢と能力がある場合は、SQL Server 2008 にアップグレードすることをお勧めします。これには、1 つのステートメントで複数の挿入を行うための T-SQL への追加など、多くの利点があります。

于 2009-06-14T15:42:28.253 に答える
0

それらをバッチ処理する方がはるかに高速になります。そうしないと、SQLサーバーは実行計画などを確認する必要があります。ループとステートメントの大きさによっては、一度にN個のレコードを送信してから、それを許可する可能性があります戻ってきて、一息つくためだけに。あなたが考慮したいかもしれない他のこと(私は、あたかも「コードを捨てる」、[1回限りのこと]であるかのようにこれに来ています)は、一括読み込みを行うことです。SSISもオプションです...

于 2009-06-14T15:38:39.947 に答える
0

Postgres では、CSV のような形式で一括挿入できる COPY を使用します。sqlserver に似たようなものがあるかどうかはわかりません。

もう 1 つの方法は、ストアド プロシージャを使用して、データの長いリストをバックエンド挿入ループに渡すことです。

于 2009-06-14T15:39:39.633 に答える
0

あなたの倍数がいくつあるかによって異なります。しかし、間違いなく Sql Bulk Copy も確認する必要があります-非常に高速で非常に便利です。

マルク

于 2009-06-14T15:44:31.117 に答える