sql – 非常慢的DELETE查询

前端之家收集整理的这篇文章主要介绍了sql – 非常慢的DELETE查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有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)

我知道还有其他解决方案如何解决这个问题.像填写从第一个列表中删除的第三个列表.但我的问题是:

为什么这些删除查询这么慢,为什么我会看到这些奇怪的查询计划?

解决方法

将主键添加到表变量中,并观察它们的尖叫
DECLARE @IdList1 TABLE(Id INT primary Key not null)
DECLARE @IdList2 TABLE(Id INT primary Key not null)

因为这些表变量没有索引,任何连接或子查询都必须检查10,000次10,000到10000,000对的值.

原文链接:https://www.f2er.com/mssql/82208.html

猜你在找的MsSQL相关文章