日期:2014-05-18  浏览次数:20665 次

如何快速删除大批量数据(带条件删除)
原表五千万级以上,每天需要删除最近30天内数据(300万-500万)

今天刚试了下,delete到现在已经2个小时了,还没完。。。。



------解决方案--------------------
贴一个个人之前的总结。

SQL code
大批量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;