我必須刪除大量的數據。截斷是不可能的,因爲關係。 我不想因爲意見而放棄桌子。 我使用下面的代碼,但有沒有更好的主意?刪除大量的數據
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
我必須刪除大量的數據。截斷是不可能的,因爲關係。 我不想因爲意見而放棄桌子。 我使用下面的代碼,但有沒有更好的主意?刪除大量的數據
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
截斷表將是最好的強得多。
如果你擔心因爲誠信的借鑑關係,比我建議你更新這些由外鍵引用它的表(例如,如果外鍵有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
而且,我不知道爲什麼你一個事務中這樣做?它會創建一個巨大的事務日誌並嚴重影響你的性能......當你執行像傾銷表一樣的內容時,通常事務是不相關的(這可能與你的情況有關,但我只是說很少這樣) 。如果你確實需要交易,至少要把你的延遲從它移開......
你可以做一個簡單一點:
delete table where id in (select top 1000000 id from table)
你有問題嗎? – 2010-09-02 14:07:30