2012-06-25 74 views
1

我有一個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哈克斯, 克里斯。

+1

您正在使用什麼版本的SQL Server?你可能想看看分區。 –

+0

您在刪除時是否擁有對數據庫的獨佔訪問權限? – podiluska

+0

你看過查詢計劃嗎?這需要一段時間,因爲SQL需要查找行,我想象一下表掃描正在執行 - 任何想法? – Charleh

回答

1

我會考慮的第一件事是確保表中有一個索引,其中TimeStamp是第一個索引列。

更多細節:

如果時間戳不是第一列和您的查詢面前而來的列不過濾,則不能使用索引(想象一下找一本書一個圖書館,你知道第二個字的第一個字母)。

通過查看SSMS中腳本的執行計劃,您可以有更好的想法。如果E12_MessageTracking上的查詢表示Table Scan,則不使用索引。

+0

這些指標讓我對使用它們的誠實的最佳方式感到困惑。我在包含的列中使用TimeMeamp的InternalMessageID設置了索引,它是否會提高性能,以便爲Timestamp提供單獨的索引?甚至從現有的索引中刪除時間戳,並讓它獨立創建? – HungryHippos

+0

謝謝我會嘗試你的建議,我在週末暫停了更新腳本,所以我只是把日誌放在一起。然後,我會嘗試刪除聲明,並檢查您的建議的執行計劃,敬請期待! – HungryHippos

+1

謝謝!爲了避免這個問題,我改變了腳本的邏輯,因爲我不認爲SQL框有足夠的資源去做我想做的事情。但如果我沒有這樣做,我懷疑這將是正確的道路,所以我已經標記爲答案。 – HungryHippos