我在SQL Server 2012 Standard数据库中有以下PipelineArchives
表(恢复模型是"简单"):
该表保存Body
列中的归档数据。随着时间的推移,这已经增长,现在包含11,914行,总共53GB的数据。我想执行一个查询,删除当前日期前3个月内CreatedOn
值的所有行。
我试过了
DELETE FROM PipelineArchives
WHERE CreatedOn < MyDate
当MyDate
条件产生几行时,查询会在几秒钟内从SSMS执行。但是,增加日期以获得229行需要30秒。
是否有更有效的方法来删除行?
答案 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