Ditt index stöder inte riktigt frågan eftersom frågan inte refererar till den inledande nyckelkolumnen. Så den måste skanna hela tabellen med eller utan detta index. Du kan överväga ett index på DataPointDate enbart för att stödja denna raderingsoperation om det är något du kör ofta.
Om DataPointID är en IDENTITY-kolumn och DataPointDate skrivs in sekventiellt kan du också överväga denna variant:
DECLARE @maxID INT;
SELECT @maxID = MAX(DataPointID)
FROM dbo.tblTSS_DataCollection
WHERE [DatapointDate] < DATEADD(D, -7, GETDATE());
DELETE dbo.tblTSS_DataCollection
WHERE DataPointID <= @maxID;
En annan sak du kan tänka dig att göra (om det är borttagningen och inte skanningen som bidrar till långsamheten) är (a) att se till att din logg har tillräckligt med utrymme för borttagningen och inte dödar dig med en massa autotillväxter, och ( b) utföra arbetet i omgångar:
BEGIN TRANSACTION;
SELECT 1;
WHILE @@ROWCOUNT > 0
BEGIN
COMMIT TRANSACTION;
DELETE TOP (1000) dbo.tblTSS_DataCollection WHERE ...
END
COMMIT TRANSACTION;