我有一個Web應用程序,它從包含消息跟蹤日誌的SQL DB讀取數據,出於性能原因,我想確保數據庫中永遠不會有超過2天的日誌值。快速刪除比2天前更早的行
通常這是一個簡單的挑戰,只需用刪除語句刪除記錄?
不幸的是,對我來說不是那麼簡單,表中包含的記錄數爲幾百萬,而刪除語句需要一段時間才能運行。有沒有辦法讓這個更快?
目前,我正在做這個:
DECLARE @CutOffDate datetime;
SET @CutOffDate = DATEADD(d, -2, GETDATE());
WHILE @@ROWCOUNT > 0
BEGIN
DELETE TOP (2000) E12_MessageTracking
WHERE [TimeStamp] < @CutOffDate;
DELETE TOP (2000) E12_MessageTracking_Recipients
WHERE [TimeStamp] < @CutOffDate;
END
我正在批量插入查詢相當頻繁,所以我需要能夠經常運行刪除爲好,但目前的任務就是「超越」上刪除語句和運行的腳本不能跟上實時。
UPDATE:
這是版本信息,你們問:
的Microsoft SQL Server 2008 R2(RTM) - 10.50.1810.0(X64)2012年2月3日十七時19分10秒版權所有( c)Windows NT 6.1上的Microsoft Corporation標準版(64位)(內部版本7600:)(管理程序)
對於索引,表格不具有PK/FK關係,但它們在稱爲MessageID的字段。問題是MessageID並不總是被填充,所以我使用了一個名爲InternalMessageID的子字段,它的鏈接更好。我遇到的其中一個問題是E12_MessageTracking表中的每條消息都有多行,它們鏈接到E12_MessageTracking_Recipients表。
我很想在這些表格之間建立適當的關係,但現在我不能這樣做,因爲我沒有辦法在不使用預先存在的InternalMessageID或MessageID列的情況下識別與消息相關的所有項目。
對於指標,有如下幾點:
E12_MessageTracking
在InternalMessageID列索引,與時間戳和事件設定
E12_MessageTracking_Recipients
在InternalMessageID列索引包含的列,包括列設置爲時間戳和收件人
T哈克斯, 克里斯。
您正在使用什麼版本的SQL Server?你可能想看看分區。 –
您在刪除時是否擁有對數據庫的獨佔訪問權限? – podiluska
你看過查詢計劃嗎?這需要一段時間,因爲SQL需要查找行,我想象一下表掃描正在執行 - 任何想法? – Charleh