DELETE-Befehl ist zu langsam in eine Tabelle mit einem Gruppierten Index
Ich habe eine ziemlich große Tabelle mit dem Namen FTPLog mit rund 3 Millionen aufnehmen wollte ich hinzufügen, ein löschen-Mechanismus, um löschen Sie alte Protokolle, aber Befehl löschen dauert lange. Ich fand, dass gruppierten index löschen dauert lange.
DECLARE @MaxFTPLogId as bigint
SELECT @MaxFTPLogId = Max(FTPLogId) FROM FTPLog WHERE LogTime <= DATEADD(day, -10 , GETDATE())
PRINT @MaxFTPLogId
DELETE FROM FTPLog WHERE FTPLogId <= @MaxFTPLogId
Möchte ich wissen, wie kann ich die Leistung verbessern zu löschen?
Ist die FTPLogID Spalte indiziert?
Ja, es ist primary key
Wie viele Zeilen gelöscht werden, und wie lange dauert es?
Gibt es noch andere Indizes auf der Tabelle außer dem Primärschlüssel?
Es gibt keine andere Indizes habe ich herausgefunden, dass zuerst löschen, ist sehr zeitaufwändig.Es ist über 2 Millionen Datensätze
Ja, es ist primary key
Wie viele Zeilen gelöscht werden, und wie lange dauert es?
Gibt es noch andere Indizes auf der Tabelle außer dem Primärschlüssel?
Es gibt keine andere Indizes habe ich herausgefunden, dass zuerst löschen, ist sehr zeitaufwändig.Es ist über 2 Millionen Datensätze
InformationsquelleAutor Ahmadreza | 2009-05-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte es langsam sein, weil ein großer löschen, erzeugt ein großes Transaktionsprotokoll. Versuchen Sie, löschen Sie es in Stücke, wie:
Dies erzeugt kleinere Transaktionen. Und es mildert locking Probleme durch die Schaffung von Raum zum atmen für andere Prozesse.
Könnten Sie auch einen Blick in partitionierte Tabellen. Diese potentiell erlauben, Sie zu reinigen, die alten Einträge durch löschen einer ganzen partition.
Immer verwenden Sie immer die Chargen beim löschen eine Menge von Daten. IMMER.
InformationsquelleAutor Andomar
Da es eine log-Tabelle, gibt es keine Notwendigkeit, die gruppiert ist.
Ist es unwahrscheinlich, dass Sie suchen, werden Sie auf
Id
.Ändern Sie Ihre
PRIMARY KEY
so, dass es unclustered. Dies wird mitHEAP
Lagerung-Methode, die schneller auf dieDML
:und nur Problem:
InformationsquelleAutor Quassnoi
Überprüfen Sie die Dichte der Tabelle (verwenden Sie den Befehl DBCC showcontig zu überprüfen, Dichte)
Scan-Dichte [Bester Wert:Tatsächlicher Wert] sollte dieser parameter näher an 100% und Logische scanfragmentierung parameter werden sollte, näher zu 0% für die beste Leistung von Ihrem Tisch. Wenn nicht, re-index und refragment der index der Tabelle zu verbessern die performance Ihrer Ausführung der Abfrage.
InformationsquelleAutor Samiksha
Ich gehe davon aus, dass nicht nur diese Tabelle ist riesig in Bezug auf die Anzahl der Zeilen, sondern auch, dass es wirklich schwer für die Anmeldung neue Einträge, während Sie versuchen, es zu bereinigen.
Vorschlag von Andomar sollte helfen, aber ich würde versuchen, es zu bereinigen, auch wenn es keine Einsätze geht.
Alternative:, wenn Sie schreiben Protokolle, die Sie wahrscheinlich interessieren sich nicht die Transaktions isolation die so viel. Ich würde es daher ändern Sie die Isolationsstufe für die code/- Prozesse, das schreiben der log-Einträge, so dass Sie kann vermeiden Sie das erstellen von riesigen
tempdb
(by the way, überprüfen Sie, ob tempdb-Datenbank wächst, eine Menge während dieser Löschvorgang)Außerdem denke ich, dass Löschungen aus dem clustered index sollte nicht wirklich langsamer als die von nicht-gruppierten eins: Sie sind immer noch psysically löschen von Zeilen. Der Wiederaufbau dieses index danach kann einige Zeit dauern, aber.
InformationsquelleAutor van