SQL Server - 有效地删除行

时间:2017-09-16 07:53:12

标签: sql sql-server tsql

我在SQL Server 2012 Standard数据库中有以下PipelineArchives表(恢复模型是"简单"):

enter image description here

该表保存Body列中的归档数据。随着时间的推移,这已经增长,现在包含11,914行,总共53GB的数据。我想执行一个查询,删除当前日期前3个月内CreatedOn值的所有行。

我试过了

DELETE FROM PipelineArchives 
WHERE CreatedOn < MyDate

MyDate条件产生几行时,查询会在几秒钟内从SSMS执行。但是,增加日期以获得229行需要30秒。

是否有更有效的方法来删除行?

3 个答案:

答案 0 :(得分:2)

您可以增加删除,它将阻止对表的锁定并允许其他事务运行。它将使用更多的CPU和内存,但它更精通。

DECLARE @archiveId BIGINT

WHILE (SELECT COUNT(*) FROM PipelineArchives WHERE CreatedOn < MyDate) > 0
BEGIN

   SELECT TOP 1 @archiveId = PipelineArchiveId
   FROM PipelineArchives 
   WHERE CreatedOn < MyDate

   DELETE PipelineArchives 
   WHERE PipelineArchiveId = @archiveId

END

答案 1 :(得分:0)

有时候正确的做法是反过来。

创建新表PipelineArchivesNew并从PipelilneArchives where CreatedOn >= MyDate复制行。获得新表格中所需的所有数据后,将PipelineArchives重命名为PipelineArchivesOld,将PipelineArchivesNew重命名为PipelineArchives。然后放下PipelineArchivesOld

根据系统的设置方式,这可能是也可能不是一个好的解决方案。

答案 2 :(得分:0)

你也可以尝试不带变量:

SET ROWCOUNT 5

WHILE (SELECT COUNT(*) FROM PipelineArchives WHERE CreatedOn < MyDate) > 0
BEGIN
   DELETE PipelineArchives 
   FROM PipelineArchives 
   WHERE CreatedOn < MyDate
END

SET ROWCOUNT 0