質問: 膨大な量のデータをSQLサーバーに挿入しようとしています。私の目的地テーブルは "ハッシュ"と呼ばれるユニークなインデックスを持っています。 SqlDataAdapter実装をSqlBulkCopyに置き換えたいと思います。 SqlDataAapterには "ContinueUpdateOnError"というプロパティがあり、trueに設定するとadapter.Update(table)はすべての行を挿入し、エラー行にRowErrorプロパティを付けます。 問題は、SqlBulkCopyを使用して、挿入された行と(一意のインデックスのために)挿入されなかった行を追跡しながら、できるだけ早くデータを挿入する方法です。 追加情報は次のとおりです。 1. このプロセスは反復的であり、多くの場合スケジュールを繰り返して設定されます。 2. ソーステーブルとデスティネーションテーブルは巨大になることもあれば、何百万行になることもあります。 3. 最初にハッシュ値を確認することは可能ですが、行ごとに2つのトランザクションが必要です(最初に宛先テーブルからハッシュを選択してから挿入を実行する)。私はadapter.update(table)のケースでは、行ごとのハッシュヒットを調べるよりもRowErrorを調べる方が速いと思います。
回答: SqlBulkCopyは、非常に制限されたエラー処理機能を備えています。デフォルトでは、制約をチェックすることさえありません。 しかし、その速い、本当に本当に速い。 重複キーの問題を回避し、バッチ内の重複する行を特定する場合は、 1つのオプションは次のとおりです。 * トラン * テーブルのtablockxをつかみ、現在の「ハッシュ」の値をすべて選択し、HashSetでチャックします。 * 重複を除外してレポートします。 * データを挿入する * コミットトラン 巨大なセットを挿入していて、テーブルの初期データのサイズがあまりにも大きくない場合、このプロセスは効果的に機能します。 あなたは問題の文脈の残りを含めるためにあなたの質問を拡大してください。 **EDIT** もう少し文脈があるようになったので、ここで別の方法を考えてみましょう。 * 一括挿入を一時テーブルに入れます。 * 直列化可能なトランを開始する * 送信先テーブルにすでにあるすべての一時行を選択...レポート * テンポラリテーブルのデータを実テーブルに挿入し、ハッシュの左結合とすべての新しいローの挿入を実行します。 * トラン そのプロセスは往復では非常に軽く、スペックは非常に高速になるはずです。