Ihr Index unterstützt die Abfrage nicht wirklich, da die Abfrage nicht auf die führende Schlüsselspalte verweist. Es muss also die gesamte Tabelle mit oder ohne diesen Index scannen. Sie könnten einen Index nur für DataPointDate in Betracht ziehen, um diesen Löschvorgang zu unterstützen, wenn Sie ihn häufig ausführen.
Wenn DataPointID eine IDENTITY-Spalte ist und DataPointDate sequenziell eingegeben wird, können Sie auch diese Variante in Betracht ziehen:
DECLARE @maxID INT;
SELECT @maxID = MAX(DataPointID)
FROM dbo.tblTSS_DataCollection
WHERE [DatapointDate] < DATEADD(D, -7, GETDATE());
DELETE dbo.tblTSS_DataCollection
WHERE DataPointID <= @maxID;
Eine andere Sache, die Sie in Betracht ziehen könnten (wenn das Löschen und nicht der Scan zur Langsamkeit beiträgt), ist (a) sicherzustellen, dass Ihr Protokoll genügend Platz für das Löschen hat und Sie nicht mit einem Haufen automatischer Vergrößerungen umbringt, und ( b) Durchführen der Arbeit in Chargen:
BEGIN TRANSACTION;
SELECT 1;
WHILE @@ROWCOUNT > 0
BEGIN
COMMIT TRANSACTION;
DELETE TOP (1000) dbo.tblTSS_DataCollection WHERE ...
END
COMMIT TRANSACTION;