SQL のパフォーマンスに問題があります。突然の理由で、次のクエリは非常に遅くなります。
特定のテーブルの ID を含む 2 つのリストがあります。Id が 2 番目のリストに既に存在する場合は、最初のリストからすべてのレコードを削除する必要があります。
DECLARE @IdList1 TABLE(Id INT)
DECLARE @IdList2 TABLE(Id INT)
-- Approach 1
DELETE list1
FROM @IdList1 list1
INNER JOIN @IdList2 list2 ON list1.Id = list2.Id
-- Approach 2
DELETE FROM @IdList1
WHERE Id IN (SELECT Id FROM @IdList2)
2 つのリストに 10.000 を超えるレコードが含まれている可能性があります。その場合、両方のクエリの実行にそれぞれ 20 秒以上かかります。
実行計画も、私が理解できないことを示していました。たぶん、それがとても遅い理由を説明しています:
両方のリストに 10.000 の連続した整数を入力したので、両方のリストに開始点として 1 ~ 10.000 の値が含まれていました。
@IdList2 の両方のクエリが表示されていることがわかるように、実際の行数は 50.005.000 です!!. @IdList1 は正しいです (実際の行数は 10.000 です)
これを解決する方法が他にもあることは知っています。最初のリストから削除するのではなく、3 番目のリストを埋めるようなものです。しかし、私の質問は次のとおりです。
これらの削除クエリが非常に遅いのはなぜですか? また、これらの奇妙なクエリ プランが表示されるのはなぜですか?