質問: 私はASP.NET MVCとC#を使用してVisual Studio Webアプリケーションを使用しています。 SQL Server 2008 R2にインポートするための100,000を超えるレコードのExcelファイルがあります。 私が使用している`SqlBulkCopy` ado.netので`DataTable`テーブル(にデータをコピーするために`Table1` )。 データの検証と処理、有効/無効のマーキング。 次いで、3つのテーブル(にレコードを追加し、更新`Table2` 、 `Table3`及び`Table4`から) `Table1`ストアドプロシージャを使用しました。 `Table4`は2つのトリガーがあり、カーソルを使用して`Table4`内の関連レコードと別の表(表2)を更新してい`Table2` 。 テスト時に、ローカルマシンからデバッグモードを使用して10000レコードに1分かかっています。 同時に10人または100人のユーザーがインポートすると、サポートされますか? 多くの同時ユーザーをサポートするための改善プロセスがありますか? 私のコンピュータ構成: * Windows 10 64ビット * AMD FX QuardCore 3.6 GHzプロセッサ * 8GBのRAM * Excelファイルには50列が含まれています * バルクコピーには2〜3秒かかります * ストアドプロシージャは30秒から2分かかります 5人の同時ユーザーでテストすると、2または3のプロセスが正常に実行され、このエラーが発生します。 > トランザクション(プロセスID 66)がロック時にデッドロックされました。他のプロセスとの通信バッファリソースがデッドロックの犠牲者として選択されました。トランザクションを再実行します。 > >
回答: 1. インポート中にインデックスを無効にする(または、後でドロップして再作成する)ことはできますか?索引は選択を固定しますが、大きな表の挿入と更新は遅くなりますか? INSERTとUPDATEの代わりにMERGEを使用してください。 2. カーソルの代替(CTEやwhileループやMERGE文など)を探したり、FAST_FORWARDカーソルを使用していない場合はそれを使用します。 3. どのようにデータを検証していますか?そのステップは十分速いですか? 4. バルク処理中にトリガーが必要ですか?これらのテーブルはどこかから使用されていますか?行ごとに実行されるトリガーのコードは、バルクインポートプロセスでバッチで実行できますか? Sqlのトリガを無効にするオプションがあります。それが目的に合っているかどうかを確認してください。 5. SSISパッケージはデータをインポートしてそのようなことを行うこともできます。 6. table2_temp、table3_temp、table4_tempを作成することができます(ユーザーごとに動的に作成し、後で削除することができます)。別々の処理を行い、table4のトリガーが既存のデータで機能しない場合は、main table2、table3、table4にマージします。