2016-08-16 163 views
0

大量記錄的有效方式考慮這個查詢刪除在SQL Server

Delete from T1 where T1.ID in (select ID from T2) 

T1和T2是數以百萬計的記錄的順序大量的表。

T1是「活」表,T2是「存檔」表。在我們將記錄從T1複製到T2之後,我們想從T1中清除它。使用多個索引對T1進行讀取優化。

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

我在.net環境中,所以基於代碼的解決方案也可以工作。

回答

1

對於數據庫的性能,最好刪除批記錄,以便鎖定最小化。

DELETE TOP (1000) 
FROM T1 
WHERE T1.ID IN (SELECT ID  
FROM T2) 

您可以優化的被刪除的記錄數。

,直到沒有記錄被刪除

3
  1. 刪除數據分批避免鎖定,越來越多的事務日誌,並回收在事務日誌空間
  2. 有刪除沒有通用的方法重新運行該腳本數據有效。你必須嘗試使用​​所有三種方法爲您的桌面數據庫設計:
    • IN(SELECT ...)
    • EXISTS()
    • INNER JOIN

在大多數情況下, ,對於大量的行,EXISTS和INNER JOIN優於IN(SELECT ..),並且經常存在優於INNER JOIN

+0

我檢查了IN(SELECT)和EXISTS的查詢計劃 - 它們完全一樣。運行時間有什麼不同? –

+0

您可能具有相同的運行時間,但如果添加更多數據,將來可能會更改執行計劃,因此差異可能會很大。根據我的經驗(以及我在網上閱讀的內容),選擇的順序是EXISTS,然後是INNER JOIN,然後是IN。如果你是批量更新,使用哪種方法並不重要。 – Anton