セットアップ: SQL Server 2008 R2
バック ストーリー: 一度に複数のスレッドで呼び出される proc があります。これらのスレッド化された proc 呼び出しは、書き込み先のテーブルに重複 (重複) データを書き込むことがあります。挿入ステートメントには、重複が挿入されないようにする「NOT EXISTS」句がありますが、まだ重複が発生しています。
質問: "NOT EXISTS" 句は単純な選択を行います。おそらく、スレッド化された呼び出しの挿入がミリ秒間隔で行われるため、一部のインデックス (特に "NOT EXISTS" 句で使用されるインデックス) が更新されない可能性があります。まだ?したがって、挿入を行う前に既存のレコードが表示されませんか?
考え: これは、SQLがどのように機能するかを理解していない可能性があります。「WHERE NOT EXISTS」を含む挿入がある場合、挿入を行う前にレコードが存在しないことを確認しますか? それとも、各行を挿入するときに行ごとにチェックしますか? 前者の場合(挿入を行う前にすべてをチェックする)、他の呼び出しの1つがまだ挿入を完了していない可能性があると思います。
私は困惑しています。
これが私がやっていることの例です:
INSERT INTO [SomeTable] (Col1,Col2) 選択する 列A、 列B から #TempTable どこ 存在しません ( 選択 1 FROM [一部のテーブル] WHERE Col1 = #TempTable.ColumnA AND Col2 = #TempTable.ColumnB )