Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2005 Löschabfrage LANGSAM

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;