2010-10-21 20 views

回答

8

使用select into將您不想刪除的行復制到臨時表中,然後使用truncate表而不是刪除。將行復制回舊錶中。首先記住drop contraints

如果您有標識列,承租人數據後,使用類似這樣補種表。

declare @seed int 
select @seed = max(identity_col)+1 from tableName 
DBCC CHECKIDENT (orders, table_name, @seed) 
+0

不錯!我有身份專欄,所以將不得不處理,但沒關係。 – Rory 2010-10-21 11:28:52

+1

+1 - 這至少在2005+以上(至少不知道以前的版本)是最低限度登錄的,所以它應該超級快。請記住重建索引所需的時間。 – JNK 2010-10-21 12:29:48

2

鑑於您希望刪除90%的行,對於希望保留到新表中的10%行,SELECT INTO可能是最快的。

1

如果你不能休息複製到另一張表,然後再截斷和複製回來...

...下探指數大約是你可以做編程聰明的嘛。在這種情況下,刪除索引並重新創建索引可能會有幫助

...或獲得更快的磁盤子系統,主要用於數據。

恢復模式不會幫助 - 恢復模式表示日誌是可刪除後立即(可BBE隱含的)承諾,但什麼也沒有避免被軟件寫的日誌條目。

1

添加一個IsDeleted (BIT)標誌,將其設置爲1表示這些90%,並在您的表上創建一個視圖,其中只顯示IsDeleted=0的行。

刪除始終是)一個資源密集型操作,和b)破壞問責的任何可能性 - 我會嘗試,如果以往任何時候都可能避免它,因爲這兩個原因(性能和數據破壞)。改用「軟刪除」方法。

相關問題