删除大量数据

时间:2010-09-02 14:04:05

标签: tsql

我必须删除大量数据。由于关系,截断是不可能的。 而且我不想因为观点而放弃桌子。 我正在使用下面的代码,但有更好的想法吗?

delete from table
WHILE 1=1
BEGIN
BEGIN TRAN
DELETE  top (1000000) from table
IF @@rowcount < 1000000 BREAK
WAITFOR DELAY '00:00:00:010'
COMMIT
end  
DELETE  from table

2 个答案:

答案 0 :(得分:4)

截断表是迄今为止最好的。

如果由于参考完整性而担心关系,我建议您单独更新那些通过外键引用它的表(例如,如果外键有ON DELETE SET NULL然后UPDATE RefTbl SET Key = NULL WHERE Key IS NOT NULL,类似地,删除如果级联等...)。

或者,如果您不希望这样,可以使用ROWCOUNT更改查询速度:

--other code for loop
SET ROWCOUNT 1000000 --this limits the number of rows that will be processed
DELETE FROM Table1

另外,我不确定你为什么要在交易中这样做?它会创建一个巨大的事务日志并严重影响您的性能......当您执行诸如转储表内容之类的事情时,通常交易不相关(在您的情况下它可能是相关的,但我只是说这种情况很少发生) 。如果你确实需要交易,至少要把你的延迟从它中移出......

答案 1 :(得分:1)

你可以做得更简单:

delete table where id in (select top 1000000 id from table)