在SQL Server中删除大量记录的有效方法

时间:2016-08-16 22:33:20

标签: sql-server ado.net

考虑此查询

Delete from T1 where T1.ID in  (select ID from T2)

T1和T2都是数百万条记录的大规模表。

T1是“实时”表,T2是“存档”表。在我们将记录从T1复制到T2之后,我们想要从T1清除它。使用许多索引读取T1优化。

执行此操作的有效方法是什么?

我在.net环境中,所以基于代码的解决方案也可以工作。

2 个答案:

答案 0 :(得分:3)

  1. 批量删除数据以避免锁定,增加事务日志并回收事务日志中的空间
  2. 没有通用的方法可以有效地删除数据。您必须尝试将所有三种方法用于表数据库设计:
    • IN(SELECT ...)
    • EXISTS()
    • INNER JOIN
  3. 在大多数情况下,对于大量行,EXISTS和INNER JOIN优于IN(SELECT ..),并且EXISTS常常优于INNER JOIN

答案 1 :(得分:1)

为了执行数据库,最好删除批记录,以便最小化锁定。

DELETE TOP (1000)
FROM T1
WHERE T1.ID IN (SELECT ID    
FROM T2)

您可以优化已删除的记录数。

重新运行脚本,直到没有记录被删除