0

我有一个删除查询,每天需要运行删除任何超过 7 天的数据,即大约 600 万条记录。

我的表应该只存储过去 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;

您可能会考虑做的另一件事(如果是删除而不是扫描导致缓慢)是(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 回答