2010-06-23 108 views
1

我有一個非常大的表(超過300萬條記錄),需要清理。大約80%需要刪除。數據庫軟件是MS SQL 2005.在表上有幾個索引和統計信息,但沒有外部關係。刪除大部分巨大的表

到目前爲止,我想出的最佳解決方案是將數據庫置於「簡單」恢復模式,將我想保留的所有記錄複製到臨時表中,截斷原始表,將標識插入設置爲打開並從臨時表中複製數據。

它的工作原理,但它仍需要幾個小時才能完成。有沒有更快的方法來做到這一點?

+0

桌子上是否有觸發器? – 2010-06-23 10:02:21

+0

不,沒有觸發器 – Stephane 2010-06-23 10:05:01

+0

我不明白你爲什麼需要複製後退步驟。難道你不能放棄表格並重命名臨時表格嗎? – 2010-06-23 10:07:54

回答

1

根據意見,我的建議是簡單地省略拷貝後退步驟,並通過重命名將包含記錄的表提升爲新的主表格。

它應該是相當簡單的腳本列的索引/統計創建之前它被交換到被應用到新表。

聚集索引應在非聚集索引之前創建。

雖然我不確定幾點。

  1. 無論插入一個堆會更快,然後創建聚集索引。 (我想沒有如果插入可以聚集索引的順序進行)
  2. 無論是原來的表應該被丟棄之前(我猜是)
+0

我想我會首先創建聚集索引,但它應該無關緊要:無論如何,這是一個代理鍵,所以初始選擇應該已經按照正確的順序創建了表。不過,我會通過添加ORDER BY語句來確保。 爲什麼在刪除表之前需要截斷表格?就我所知,這兩種操作都沒有日誌支持。 我會試試這個並報告結果。 – Stephane 2010-06-24 12:36:07

+0

@Stephane在這一點上我只是不確定。如果您以任何方式確認,我會感興趣。 – 2010-06-24 12:37:32

0

我不確定你的數據結構是什麼。什麼時候一行符合刪除條件?如果它是基於日期的純粹ID,那麼您可以爲每一天創建一個新表,將新數據插入到新表中,並且在清理時只需刪除所需的表。然後對於任何選擇構建一個對所有表格的視圖。只是一個想法。

編輯:(評論回覆) 如果你正在維護所有表的視圖,那麼它不會變得複雜。複雜的部分是編碼視圖的丟棄和重新創建。

我假設您不希望數據在刪除過程中被鎖定太多。爲什麼不組塊刪除操作。創建一個SP,它將一次刪除500000行數據塊中的數據。這應該確保SQL Server保持行鎖而不是表鎖。使用

WAITFOR DELAY 'x' 

在你的while循環中,這樣你可以給其他查詢一點喘息的空間。你的問題是計算機科學的老舊,空間與時間的關係。

+0

數據已經存在,並且它已被應用程序使用。除此之外,它會使搜索剩餘數據變得相當複雜。 – Stephane 2010-06-23 13:10:10

+0

這仍然會被記錄下來。 OP正在設法避免日誌記錄的開銷,使其更快,並沒有提到任何有關最小化對併發事務的影響。我猜想可能沒有。 – 2010-06-24 11:26:27

1

@uriDium截斷 - 50000 採用分塊分批將升級到表鎖,除非您已通過alter table(sql2k8)或其他各種鎖定技巧禁用鎖升級。