「刪除塊」是刪除過量數據而不會增加事務日誌文件的首選方法。 BradC的帖子就是一個合理的例子。
管理這樣的循環最好在單個存儲過程中完成。隨着時間的推移,爲了傳播這些工作,我仍然保留在程序中。如果您認爲有必要處理可能發生的併發問題,則在循環中插入WAITFOR會在每次刪除之間設置一個「暫停」。使用SQL代理作業確定過程何時開始 - 如果需要確保過程停止一段時間,則將其應用到循環中。
我對這個代碼旋轉將是:
-- NOTE: This is a code sample, I have not tested it
CREATE PROCEDURE ArchiveData
@StopBy DateTime
-- Pass in a cutoff time. If it runs this long, the procedure will stop.
AS
DECLARE @LastBatch int
SET @LastBatch = 1
-- Initialized to make sure the loop runs at least once
WHILE @LastBatch > 0
BEGIN
WAITFOR DELAY '00:00:02'
-- Set this to your desired delay factor
DELETE top 1000 -- Or however many per pass are desired
from SourceTable
-- Be sure to add a where clause if you don't want to delete everything!
SET @LastBatch = @@rowcount
IF getdate() > @StopBy
SET @LastBatch = 0
END
RETURN 0
嗯。重新讀你的帖子意味着你想在刪除它之前先將數據複製到某個地方。爲此,我將設置一個臨時表,並在循環內首先截斷臨時表,然後複製TOP N項的主鍵,通過連接到臨時表中插入到「存檔」表中,然後通過加入臨時表來刪除源表。 (只是比直接刪除更復雜一點,不是嗎?)
你是對的。在兩個表格中,我在技術上將數據「歸檔」,如將數據複製到同一服務器上的另一個數據庫,然後刪除現有記錄。在另一張表中,我只是刪除了某個日期之前創建的所有記錄。 我想過使用臨時表來協助轉移,我最終可能會這樣做。我會試試看你的建議,看看結果如何。謝謝! – Kevin 2009-10-21 14:52:17