2013-10-31 35 views
1

我有一個表Tab_Log,每天填滿數千行。每週我都需要根據創建日期清理90%的行。使用delete語句可以工作,但是由於所有刪除都會被記錄,所以資源密集。我的第二個想法是將我不想從Tab_Log中刪除的數據插入臨時表truncate Tab_Log,然後將臨時表中的記錄插回。我擔心的是,在此過程中,用戶可能在查詢期間詢問Tab_Log截斷並重新插入進程和接收和錯誤。SQL Server 2005定期清理表沒有導致用戶錯誤

那麼如何快速擦洗這張表而不會給用戶造成錯誤呢?有沒有辦法來安全地鎖定表,以便任何傳入的查詢請求將等待而不是錯誤?

+0

SQL Server的*版本*是你的嗎?企業/標準/快遞等 –

+0

@MartinSmith - 企業 – Coltech

+0

更好地問這個問題,以dba.stackexchange.com。作爲一名具有DBA經驗的開發人員,我的答案是使用分區。請參閱http://blogs.msdn.com/b/felixmar/archive/2011/02/14/partitioning-amp-archiving-tables-in-sql-server-part-1-the-basics.aspx。檔案部分在第二篇文章 – LostInComputer

回答

1

我會建議分批做你刪除:

WHILE 1 = 1 
    BEGIN; 
    DELETE TOP(500) FROM Tab_Log WITH(ROWLOCK) WHERE CreateDate = zyz; 
    IF @@RowCount = 0 BREAK; 
    END; 
1

明顯的解決方法。

1 - 安排90%使用SQLAGENT

2 3AM星期天刪除 - 執行刪除,而不在更小的塊刪除記錄查殺數據庫。

例如,用要被選擇的記錄的所有主鍵的主鍵填充臨時表。 (做防止不得不重複掃描主表,如果你在日期字段索引,只刪除前100)

睡2秒給其他用戶一個機會。

重複,直到一無所有根據需要刪除

調算法。