2010-09-02 82 views
2

我必須刪除大量的數據。截斷是不可能的,因爲關係。 我不想因爲意見而放棄桌子。 我使用下面的代碼,但有沒有更好的主意?刪除大量的數據

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 
+0

你有問題嗎? – 2010-09-02 14:07:30

回答

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

你可以做一個簡單一點:

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