2012-09-26 94 views
0

我有一個刪除查詢,每天需要運行刪除大於7天的約600萬條記錄的任何數據。SQL Server 2005刪除查詢SLOW

我的表格應該只存儲最近7天的數據。

這裏是我運行查詢:

DELETE FROM [tblTSS_DataCollection] 
Where [DatapointDate] < DATEADD(D, -7, GETDATE()) 

這個查詢需要5.5分鐘執行。我有一個索引設置,包括這個,所以我不認爲它應該採取這一長期執行:

CREATE UNIQUE NONCLUSTERED INDEX [IX_tblTSS_DataCollection] ON [dbo]. [tblTSS_DataCollection] 
(
[DataPointID] ASC, 
[DatapointDate] ASC, 
[AssetID] ASC 
) 

有沒有更好的方式來刪除這些數據?這需要永遠,我真的需要能夠快速刪除這些數據。

+0

事實上,建立索引正在放慢速度,因爲它也必須從索引中刪除。此外,如果您有FK關係,請確保它們不是級聯的。嘗試以較小的塊刪除,例如一次刪除1000條記錄。 – Dimitri

+0

我必須有索引,因爲我也查詢這個數據,以及顯示在圖表 –

+0

我明白這一點。不是說要刪除它,但它確實沒有幫助DELETE – Dimitri

回答

3

由於查詢未引用主鍵列,因此您的索引並不真正支持該查詢。所以,它必須掃描整個表格,不管有沒有這個索引。如果是經常運行的東西,您可以考慮在DataPointDate上單獨使用一個索引來支持此刪除操作。

如果DataPointID是標識列,並且DataPointDate依次進入,你也可以考慮這種變化:

DECLARE @maxID INT; 

SELECT @maxID = MAX(DataPointID) 
    FROM dbo.tblTSS_DataCollection 
    WHERE [DatapointDate] < DATEADD(D, -7, GETDATE()); 

DELETE dbo.tblTSS_DataCollection 
    WHERE DataPointID <= @maxID; 

另一件事你可以考慮做(如果它刪除,而不是掃描有助於緩慢)是(a)確保你的日誌有足夠的空間容納刪除,並且不會用一堆自動增長來殺死你,並且(b)批量執行該工作:

BEGIN TRANSACTION; 

SELECT 1; 

WHILE @@ROWCOUNT > 0 
BEGIN 
    COMMIT TRANSACTION; 

    DELETE TOP (1000) dbo.tblTSS_DataCollection WHERE ... 
END 

COMMIT TRANSACTION; 
+0

我必須擁有索引,因爲我也會查詢這些數據以便在圖表中顯示。那麼我是否應該創建一個包含此列的新索引? –

+0

@kevinc我並不是建議擺脫目前的指數,所以你可以停止捍衛它。我只是向你解釋,它不能幫你處理這個特定的刪除查詢。 –

+0

BEGIN TRANSACTION; WHILE @@ ROWCOUNT> 0 BEGIN COMMIT TRANSACTION; DELETE TOP(1000)dbo.tblTSS_DataCollection WHERE [DatapointDate]