2010-07-31 84 views
0

首先,我們從ProductFileLocalName中獲取最大ID,然後是 - 1000(因爲我們不想刪除最近的添加,因爲它們可能不會在ProductFileInfo插入尚)優化刪除大量行(超過幾百萬) - SQL Server 2005

然後我們通過最大id來此存儲過程:

DELETE TOP (10000) 
FROM ProductFileLocalName WITH (ROWLOCK) 
FROM ProductFileLocalName 
    LEFT OUTER JOIN ProductFileInfo AS pfi WITH (NOLOCK) ON ProductFileLocalName.ProductFileLocalNameId = pfi.ProductFileLocalNameId 
WHERE (ProductFileLocalName.ProductFileLocalNameId < @maxid AND pfi.ProductFileInfoId IS NULL); 

這是執行此操作的最有效方法是什麼?

+0

你能準確告訴我們你想要做什麼嗎?這是關於大規模刪除的第三個問題(它是數十億,現在是數百萬,現在是TOP 10000,...) – gbn 2010-07-31 12:13:42

+0

表格的百分比明智,你刪除了多少條記錄? – NinjaCat 2010-07-31 12:54:16

+0

@gbn這是一個差異表,另一個表我使用了你的建議,它運行良好。 – RPS 2010-07-31 15:14:36

回答

0

如果你真的只保留1000萬,你是否有選擇將你想保留的東西複製到一個雙表(相同的scehema),然後將大的副本複製並複製回那個小的子集? 。你需要測量這個選項的時間,並檢查連續延遲時間可以承受多長時間。

另一種方法是找出可用作分區列的列 - 假設這些百萬條記錄在某個較長的時間段內進入,您可能可以建立安全的時間限制並始終在較早的分區(或分區),甚至首先將它們分開。

正如其他人所提到的,如果您希望人們思考更多特定場景而不是猜測,那麼您需要將更多具體信息放入問題中 - 對於所有大的刪除都沒有單一的策略。