【发布时间】:2013-10-03 20:39:36
【问题描述】:
我有这个功能,可以从超过 1000 万行的大表中删除不再需要的历史数据
DELETE FROM BigTable
WHERE DATEDIFF(month,dtmtimestamp, getdate()) > 2)
然后我尝试了这种方法来减少事务日志使用的空间量:
WHILE (SELECT COUNT(*) FROM BigTable WHERE DATEDIFF(month,dtmtimestamp, getdate()) > 2) > 0 BEGIN
DELETE TOP 10000 FROM BigTable
FROM BigTable
WHERE DateDiff(month,dtmtimestamp, getdate()) > 2
CONTINUE END
这是正确的方法吗?还是这样我会用完更多的事务日志?
有什么好的方法吗?
干杯,
尼可
最终答案:
DECLARE @Remainder INT
DECLARE @ChunkSize INT
SET @Remainder = (SELECT COUNT(id) FROM BigTable WHERE dtmtimestamp < DateAdd(month, -2, getdate()))
SET @ChunkSize = CEILING(@Remainder/100) /* Divide the total into 100 parts, whole integers only */
WHILE @Remainder BEGIN
BEGIN TRANSACTION deletehistorical
DELETE TOP (@ChunkSize)
FROM BigTable
WHERE dtmtimestamp < DateAdd(month, -2, getdate());
SET @Remainder = @@ROWCOUNT;
COMMIT TRANSACTION deletehistorical
END
CHECKPOINT 命令仅告诉引擎从日志中删除已完成的事务(在简单恢复模式下),并且由于此查询实际上仍在继续每个循环,因此仍在创建事务。因此,为了分解事务,我添加了一个 BEGIN 和 COMMIT 来强制数据库每次都进行这些更改。
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql