2011-10-04 51 views
2

我有一個非常大的表[X],它擁有1.7億行,我們需要將數據存檔以僅保留[X]中的已用記錄。我們正在這樣做,以保持我們的系統速度放慢。我們只使用整個表中的少量行(說少於10%),所以我們可以將大量數據存檔到例如Archive。[X]中。MS SQL:從ginormous表中刪除行的最佳方式

問題是,當我們嘗試刪除記錄時,需要很長時間。現在,我們已經運行了以下檢查排除故障看到任何可能性,爲什麼需要這麼長的 1)表索引 2)沒有沒有索引的外鍵 3)無觸發上刪除

做額外的工作在後臺

您有沒有遇到類似的情況?做類似的事情時,最好遵循什麼程序?那裏有什麼工具可以幫助嗎?

我感謝您的幫助!

+0

有你嘗試刪除限制增量? –

+0

事務日誌是否在其自己的驅動器上?它的尺寸是否足夠大,還是花費了大量的時間進行自動生長?你是否必須擔心阻止併發查詢?您是否考慮過將10%插入到新表中,然後重命名而不是刪除並重新插入90% –

+0

向我們顯示您的刪除語句,我們可能能夠診斷它嗎? –

回答

4

選項

  • 爲什麼不把10%到一個新的表?
  • 批量刪除/在一個事務中插入(見下文)
  • 分區表(又名讓引擎處理它)

爲了填充存檔表

SELECT 'starting' -- sets @@ROWCOUNT 
WHILE @@ROWCOUNT <> 0 
BEGIN 
    DELETE TOP (50000) dbo.Mytable 
    OUTPUT DELETED.* INTO ArchiveTable 
    WHERE SomeCol < <Afilter> 

    -- maybe CHECKPOINT 

    WAIT FOR DELAY ... 
END 
+0

所以你建議我刪除批,直到符合條件?標準是例如日期範圍? – Mez

+0

這裏,「afilter」是例如「6個月以上的行」的過濾器。 「歸檔」數據的標準取決於您 – gbn

2

你應該去分區你的數據庫/表。

+1

我同意康康 - 創建2個分區 - >使用和未使用的數據。然後刪除意味着您將未使用的分區切換到不同的表並刪除表。 –

相關問題