sql >> Database >  >> RDS >> Sqlserver

SQL Server 2005 Query verwijderen LANGZAAM

Uw index ondersteunt de zoekopdracht niet echt, omdat de zoekopdracht niet verwijst naar de leidende sleutelkolom. Het moet dus de hele tabel scannen met of zonder deze index. U kunt alleen een index op DataPointDate overwegen om deze verwijderingsbewerking te ondersteunen als u dit vaak uitvoert.

Als DataPointID een IDENTITY-kolom is en DataPointDate opeenvolgend wordt ingevoerd, kunt u ook deze variant overwegen:

DECLARE @maxID INT;

SELECT @maxID = MAX(DataPointID) 
  FROM dbo.tblTSS_DataCollection
  WHERE [DatapointDate] < DATEADD(D, -7, GETDATE());

DELETE dbo.tblTSS_DataCollection
  WHERE DataPointID <= @maxID;

Een ander ding dat je zou kunnen overwegen te doen (als het het verwijderen is en niet de scan die bijdraagt ​​aan de traagheid) is (a) ervoor zorgen dat je log voldoende ruimte heeft om het verwijderen te accommoderen, en je niet doodt met een stel autogrows, en ( b) het werk in batches uitvoeren:

BEGIN TRANSACTION;

SELECT 1;

WHILE @@ROWCOUNT > 0
BEGIN
  COMMIT TRANSACTION;

  DELETE TOP (1000) dbo.tblTSS_DataCollection WHERE ...
END

COMMIT TRANSACTION;



  1. Probleem met een kolomnaam bevat een dubbele punt in PostgreSQL

  2. Oracle:hoe voeg ik minuten toe aan een tijdstempel?

  3. Door komma's gescheiden waarden uit twee kolommen van twee verschillende tabellen vergelijken

  4. oracle sql plus spoel