2017-02-23 49 views
0

如果我有两个非常大的表(TableA和TableB),它们都带有Id列,并且我想从TableA中删除其Ids中存在的所有行表B。哪一个会是最快的?为什么?SQL DELETE性能,T-SQL或ISO兼容查询

--ISO-compatible 
DELETE FROM TabelA 
WHERE Id IN (SELECT Id FROM TableB) 

-- T-SQL 
DELETE A FROM TabelA AS A 
INNER JOIN TableB AS B 
ON A.Id = B.Id 
+1

你应该在系统上运行的数据查询。我预计在大多数情况下,表现会非常相似,但如果你真的在乎,那就试试两种。 –

+1

查询语法并不重要 - 从中​​创建的执行计划是重要的。如果执行计划相同,则性能将相同 –

回答

2

如果有每个Id指标,就应该同样表现出色。

如果每个Id上没有索引,则exists()in()可能表现更好。

一般而言,我更喜欢exists()而不是in(),因为它允许您在需要时轻松添加多个比较。

delete a 
from tableA as a 
where exists (
    select 1 
    from tableB as b 
    where a.Id = b.Id 
) 

参考:

1

只要你在TableB ID是唯一的,这两个查询应创建相同的执行计划。只需将执行计划包含在每个查询中并进行验证即可。

在这个不错的职位请看:in-vs-join-vs-exists

1

有一个简单的方法来找出使用执行计划(按Ctrl + L上SSMS)。

因为我们不知道表格后面的数据模型(最终索引等),所以我们无法确定哪个查询将是最快的。根据经验,我可以告诉你,对于非常大的表(> 1mil行),由于所有日志记录,delete子句非常缓慢。根据您正在执行的操作,您将希望SQL Server不要记录删除。

你可能要检查这个问题: How to delete large data of table in SQL without log?