我遇到了 SQL 性能问题。由于突然的原因,以下查询非常慢:
我有两个列表,其中包含某个表的 ID。如果 ID 已存在于第二个列表中,我需要从第一个列表中删除所有记录:
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)
这两个列表可能包含超过 10.000 条记录。在这种情况下,两个查询的执行时间都超过 20 秒。
执行计划也显示了一些我不明白的地方。也许这解释了为什么它这么慢:
我用 10.000 个连续整数填充了两个列表,因此两个列表都包含值 1-10.000 作为起点。
如您所见,@IdList2 的两个查询显示实际行数为 50.005.000 !!。@IdList1 是正确的(实际行数为 10.000)
我知道还有其他解决方案如何解决这个问题。就像填写第三个列表而不是从第一个列表中删除一样。但我的问题是:
为什么这些删除查询这么慢,为什么我会看到这些奇怪的查询计划?