0

約600万レコードである7日以上経過したデータを削除するために毎日実行する必要がある削除クエリがあります。

私のテーブルには、過去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
)

このデータを削除するより良い方法はありますか?それは永遠にかかります、そして私は本当にこのデータを素早く削除することができる必要があります。

4

1 に答える 1

3

クエリは先頭のキー列を参照していないため、インデックスは実際にはクエリをサポートしていません。したがって、このインデックスの有無にかかわらず、テーブル全体をスキャンする必要があります。頻繁に実行する場合は、この削除操作をサポートするために、DataPointDateのインデックスのみを検討することをお勧めします。

DataPointIDがIDENTITY列であり、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;

実行を検討する可能性のあるもう1つのことは(スキャンが速度低下の原因ではなく削除である場合)、(a)ログに削除を収容するのに十分なスペースがあり、大量の自動拡張であなたを殺していないことを確認することです。 b)作業をバッチで実行する:

BEGIN TRANSACTION;

SELECT 1;

WHILE @@ROWCOUNT > 0
BEGIN
  COMMIT TRANSACTION;

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

COMMIT TRANSACTION;
于 2012-09-26T16:31:58.810 に答える