sql – 非常慢的DELETE查询
发布时间:2020-12-12 16:33:44 所属栏目:MsSql教程 来源:网络整理
导读:我有SQL性能问题.由于突然的原因,以下查询非常慢: 我有两个列表,其中包含某个表的Id.如果ID已经存在于第二个列表中,则需要从第一个列表中删除所有记录: DECLARE @IdList1 TABLE(Id INT)DECLARE @IdList2 TABLE(Id INT)-- Approach 1DELETE list1FROM @IdLis
我有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对的值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |