私はセミコロンで区切られた文字列をに割り当ててINSERT
からUPDATES
、SqlCommmand.CommandText
を呼び出してExecuteNonQuery()
います。
「動作」しますが、文字列に40,000のINSERTがあるとどうなるか心配です。これはすべて単一のSQLトランザクションで発生しますか?どういうわけかそれらをバッチ処理する必要があり、バッチの大きさはどのくらいにする必要がありますか?
私はセミコロンで区切られた文字列をに割り当ててINSERT
からUPDATES
、SqlCommmand.CommandText
を呼び出してExecuteNonQuery()
います。
「動作」しますが、文字列に40,000のINSERTがあるとどうなるか心配です。これはすべて単一のSQLトランザクションで発生しますか?どういうわけかそれらをバッチ処理する必要があり、バッチの大きさはどのくらいにする必要がありますか?
40.000の挿入の場合、おそらく1つのトランザクションでそれらを実行する必要があります。パフォーマンスに優れ、エラー回復にも優れています(問題が発生した場合にテーブルが部分的にいっぱいになることはありません)。そして、私が知る限り、それは自動的には発生しません(つまり、トランザクションを開始しない場合、およびデータベースレベルで暗黙的にトランザクションを開くことがない場合(とにかく明示的なコミットが必要)、トランザクションはありません)。
明示的に開かれたトランザクション内で、パラメーターを使用して準備されたクエリを使用し、ループで実行することをお勧めします。
挿入された値の強力なスキーマがある場合は、ユーザー定義のテーブルタイプの使用を検討してください。DataTable
パラメータとしてコマンド(カスタムコマンドまたはストアドプロシージャ)に渡すことができます。
CSVよりもはるかに簡単です。
そして、私は@Anton Kovalenkoに同意します。大量の行を挿入する場合は、一度に挿入する必要があります。特大(たとえば数百万)の量または行を挿入する場合にのみ、それをいくつかのバッチに分割しますが、すべての行を個別に挿入しないでください。
40.000の挿入の場合、複数のスレッドで処理されるSEPARATEトランザクションに挿入する必要があります。または、文字列の挿入ではなく、一時テーブルへのSqlBUlkCopyを使用してそれらを実行する必要があります。
基本的に、一時テーブルsqlbulkcopyを一時テーブルに作成し、selectfromに挿入してコピーします。
これは、すべてのSQLテキスト解析よりもはるかに高速です。バッチ-ええと、私は定期的に挿入で100.000行に近いバッチを実行します。このように、パフォーマンスは1秒あたり約75,000行です。
これは、1つのコマンドで送信しようとするobバイトの総数によって異なります。私が知っている唯一の制限は、65,536になるバッチサイズです*ネットワークパケットサイズ(通常は4096)= 268435456バイト http://msdn.microsoft.com/en-us/library/ms143432.aspx