日期:2014-05-18 浏览次数:20707 次
大批量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;