将您的删除“分块”是删除大量数据而不会使事务日志文件膨胀的首选方法。BradC 的帖子就是一个合理的例子。
管理此类循环最好在单个存储过程中完成。为了随着时间的推移分散这些工作,我仍然会将其保留在程序中。如果您认为有必要处理可能的并发问题,则在循环中插入 WAITFOR 将在每组删除之间放置一个“暂停”。使用 SQL 代理作业来确定过程何时开始 - 如果您需要确保它在某个时间停止,也可以将其放入循环中。
我对这段代码的看法是:
-- NOTE: This is a code sample, I have not tested it
CREATE PROCEDURE ArchiveData
@StopBy DateTime
-- Pass in a cutoff time. If it runs this long, the procedure will stop.
AS
DECLARE @LastBatch int
SET @LastBatch = 1
-- Initialized to make sure the loop runs at least once
WHILE @LastBatch > 0
BEGIN
WAITFOR DELAY '00:00:02'
-- Set this to your desired delay factor
DELETE top 1000 -- Or however many per pass are desired
from SourceTable
-- Be sure to add a where clause if you don't want to delete everything!
SET @LastBatch = @@rowcount
IF getdate() > @StopBy
SET @LastBatch = 0
END
RETURN 0
唔。重读您的帖子意味着您想先将数据复制到某处,然后再删除它。为此,我设置了一个临时表,并在循环内首先截断临时表,然后复制前 N 个项目的主键,通过连接到临时表插入“存档”表,然后也通过连接到临时表来删除源表。(只是比直接删除复杂一点,不是吗?)