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

Wie kann ich abgelaufene Daten aus einer riesigen Tabelle löschen, ohne dass die Protokolldatei außer Kontrolle gerät?

Ich habe es als nützlich empfunden, beim Löschen von Tabellen mit einer großen Anzahl von Zeilen Zeilen in Stapeln von beispielsweise 5000 oder so zu löschen (normalerweise teste ich, um zu sehen, welcher Wert am schnellsten funktioniert, manchmal sind es 5000 Zeilen, manchmal 10.000 usw.) . Dadurch kann jeder Löschvorgang schnell abgeschlossen werden, anstatt lange auf eine Anweisung zu warten, um 400 Millionen Datensätze zu löschen.

In SQL Server 2005 sollte so etwas funktionieren (bitte natürlich zuerst testen):

WHILE EXISTS ( SELECT * FROM giganticTable WHERE exp_date < getDate())
BEGIN
  DELETE TOP(5000) FROM giganticTable WHERE exp_date < getDate()
END

Ich würde sehen, was das Löschen in Stapeln mit der Größe der Protokolldatei macht. Wenn die Protokolle immer noch explodieren, können Sie versuchen, das Wiederherstellungsmodell in Einfach , löschen Sie die Datensätze und wechseln Sie dann zurück zu Bulk Logged, aber nur, wenn das System den Verlust einiger aktueller Daten tolerieren kann. Ich würde auf jeden Fall eine vollständige Sicherung erstellen, bevor ich dieses Verfahren ausführe. Dieser Thread schlägt auch vor, dass Sie einen Job zum Sichern der Protokolle einrichten könnten, bei dem nur das Abschneiden angegeben ist, sodass dies eine weitere Option sein könnte. Hoffentlich haben Sie eine Instanz, mit der Sie testen können, aber ich würde mit den Batch-Löschvorgängen beginnen, um zu sehen, wie sich dies auf die Leistung und die Größe der Protokolldatei auswirkt.