2

私はセミコロンで区切られた文字列をに割り当ててINSERTからUPDATESSqlCommmand.CommandTextを呼び出してExecuteNonQuery()います。

「動作」しますが、文字列に40,000のINSERTがあるとどうなるか心配です。これはすべて単一のSQLトランザクションで発生しますか?どういうわけかそれらをバッチ処理する必要があり、バッチの大きさはどのくらいにする必要がありますか?

4

4 に答える 4

1

40.000の挿入の場合、おそらく1つのトランザクションでそれらを実行する必要があります。パフォーマンスに優れ、エラー回復にも優れています(問題が発生した場合にテーブルが部分的にいっぱいになることはありません)。そして、私が知る限り、それは自動的には発生しません(つまり、トランザクションを開始しない場合、およびデータベースレベルで暗黙的にトランザクションを開くことがない場合(とにかく明示的なコミットが必要)、トランザクションはありません)。

明示的に開かれたトランザクション内で、パラメーターを使用して準備されたクエリを使用し、ループで実行することをお勧めします。

于 2013-01-10T17:05:11.847 に答える
1

挿入された値の強力なスキーマがある場合は、ユーザー定義のテーブルタイプの使用を検討してください。DataTableパラメータとしてコマンド(カスタムコマンドまたはストアドプロシージャ)に渡すことができます。

CSVよりもはるかに簡単です。

そして、私は@Anton Kovalenkoに同意します。大量の行を挿入する場合は、一度に挿入する必要があります。特大(たとえば数百万)の量または行を挿入する場合にのみ、それをいくつかのバッチに分割しますが、すべての行を個別に挿入しないでください。

于 2013-01-10T17:09:26.273 に答える
0

40.000の挿入の場合、複数のスレッドで処理されるSEPARATEトランザクションに挿入する必要があります。または、文字列の挿入ではなく、一時テーブルへのSqlBUlkCopyを使用してそれらを実行する必要があります。

基本的に、一時テーブルsqlbulkcopyを一時テーブルに作成し、selectfromに挿入してコピーします。

これは、すべてのSQLテキスト解析よりもはるかに高速です。バッチ-ええと、私は定期的に挿入で100.000行に近いバッチを実行します。このように、パフォーマンスは1秒あたり約75,000行です。

于 2013-01-10T17:26:10.497 に答える
-1

これは、1つのコマンドで送信しようとするobバイトの総数によって異なります。私が知っている唯一の制限は、65,536になるバッチサイズです*ネットワークパケットサイズ(通常は4096)= 268435456バイト http://msdn.microsoft.com/en-us/library/ms143432.aspx

于 2013-01-10T17:03:14.183 に答える