SQL Server 2005删除查询SLOW

时间:2012-09-26 16:28:37

标签: sql sql-server sql-server-2005

我有一个删除查询,每天都需要删除任何超过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
)

有没有更好的方法来删除这些数据?这需要永远,我真的需要能够快速删除这些数据。

1 个答案:

答案 0 :(得分: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;