日期:2014-05-18 浏览次数:20853 次
大批量DELETE操作
单个事物中删除大量数据有几个缺点:
1、 DELETE语句被完整的记录到日志,他要求在事务日志中有足够的空间以完成整个事物。
2、 再删除操作期间(该操作肯呢过会花费很长时间),从最早打开的事务到当前时间点的所有日志都不会被重写。
而且,如果该事务因某种原因被中断,这之前噶生的所有操作都将被回滚,这也会花费一些时间。
3、 当同时删除多行时,SQL Server可能会把被删除行上的单一锁提升为排它表锁,
以阻止DELETE完成之前对目标表的读写操作。
所以把一个大DELETE事务差分成多个小事务来处理,
最好是用一个等待,这样可以日志回收,来释放系统资源。
虽然这样可能会比一个delete 语句执行时间要长,但是对整个系统影响较小。
实例:
BEGIN TRY;
DECLARE @row_count INT,@wait_for_delay CHAR(8)='00:00:10'
WHILE 1 = 1
BEGIN;
BEGIN TRAN;
DELETE TOP(5000) FROM tb WHERE create_Date<'2012-01-01'
SET @row_count=@@ROWCOUNT;
IF XACT_STATE()= 1
COMMIT;
IF @row_count<5000
BEGIN;
BREAK;
END;
ELSE
WAITFOR DELAY @wait_for_delay;
END;
END TRY
BEGIN CATCH
IF XACT_STATE()= 1
BEGIN
ROLLBACK TRAN;
END;
END CATCH;