我有一个删除查询,每天都需要删除任何超过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
)
有没有更好的方法来删除这些数据?这需要永远,我真的需要能够快速删除这些数据。
答案 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;