Verbessern Sie die Löschgeschwindigkeit für SQL Server

11

Wir haben eine riesige Produktionsdatenbank mit einer Größe von ca. 300 GB. Gibt es einen Ansatz zur Verbesserung der Leistung einer Löschabfrage? Momentan liegt die Löschgeschwindigkeit zwischen 1-10k pro Minute, sie ist für uns sehr langsam.

Gemeinschaft
quelle
2
1000 Zeilen pro Minute klingen extrem langsam. Haben Sie Blockierungen? Oder ist es auch so langsam, die Zeilen auszuwählen, was darauf hindeutet, dass ein Index erforderlich ist?
James Z
Wahrscheinlich müssen Sie einen Index erstellen, um Ihre Löschkriterien abzudecken.
Ginden
6
Es gibt nicht genügend Details, um eine Antwort zu geben. Welche Abfrage führen Sie aus? Haben Sie Indizes zu den beteiligten Kriterienspalten (falls vorhanden)? Haben Sie Auslöser beim Löschen? ...
Sébastien Sevrin
3
Versuchen Sie, eine Milliarde Zeilen gleichzeitig zu löschen? Ist es möglich, dass Sie auf Autogrow nach Autogrow nach Autogrow warten? (Es ist mehr als wahrscheinlich, dass es sich um eine Protokollaktivität handelt, auf die Sie warten, nicht um die eigentliche Löschaktivität.) Siehe diesen Artikel ...
Aaron Bertrand
3
Ebenfalls. Irgendwelche Fremdschlüsseleinschränkungen? Bitte geben Sie die vollständige Tabellendefinition, Abfrage und den Ausführungsplan an.
Martin Smith

Antworten:

18

Wenn Sie versuchen, eine große Anzahl von Zeilen in einer einzelnen Anweisung zu löschen, warten Sie wahrscheinlich auf die Protokollaktivität. Also kannst du:

  1. Stellen Sie sicher, dass Ihr Protokoll ausreichend groß ist, damit Wachstumsereignisse Sie nicht verlangsamen. Mit den Standardeinstellungen beginnt Ihr Protokoll wahrscheinlich bei 1 MB mit einem Wachstum von 10%. Wachstumsereignisse sind teuer, und wenn Sie sogar 10 GB Löschvorgänge protokollieren, wird dies die Leistung nicht nur jetzt, sondern auch in Zukunft beeinträchtigen (aufgrund dessen, was dies für VLFs bedeutet).
  2. Wenn Sie die gesamte Tabelle löschen, verwenden Sie TRUNCATEoder DROP/ CREATE.
  3. Wenn Sie den größten Teil der Tabelle löschen SELECT INTO, fügen Sie die Daten, die Sie behalten möchten, in eine andere Tabelle ein und TRUNCATEverschieben Sie den kleinen Teil zurück. (Oder löschen Sie einfach die alte Tabelle, benennen Sie die neue um und wenden Sie Einschränkungen / Berechtigungen usw. erneut an.)
  4. Minimieren Sie zunächst die Auswirkungen der Protokollierung, indem Sie die Daten in Blöcken statt auf einmal löschen. Siehe diesen Artikel . Sie können auch in Betracht ziehen, vorübergehend auf einfache Wiederherstellung umzusteigen, sodass Sie nur CHECKPOINTdas Protokoll löschen müssen, anstatt Protokollsicherungen durchzuführen. Sie müssen jedoch sicherstellen, dass Sie es zurücksetzen und eine neue vollständige Sicherung erstellen, um die Protokollkette erneut zu initiieren .
Aaron Bertrand
quelle
+1, von mir für einen ausgezeichneten Artikel. Dies hat mir in der Vergangenheit geholfen, unseren Entwicklern den Löschvorgang verständlich zu machen, wenn sie uns immer wieder wegen Langsamkeit und Wachstum der Protokolldatei erreichen.
KASQLDBA
Wenn unnötige Indizes vorhanden sind, wird die Löschgeschwindigkeit erhöht, wenn Sie sie löschen. Wenn Sie alle oder fast alle Daten löschen, kann es sich positiv auswirken, wenn Sie zuerst alle Indizes löschen und anschließend erneut erstellen.
Tony Hinkle
3
@Tony, der den Index löscht, muss ebenfalls protokolliert werden (ebenso wie das Erstellen), daher kann es nur eine Frage sein, wann Sie diese Kosten bezahlen möchten. Ohne Tests bin ich nicht davon überzeugt, dass das Löschszenario einen großen Vorteil hat (wie es beim Einfügen / Aktualisieren der Fall wäre), es sei denn, Sie haben Indizes, die Sie später nicht mehr behalten werden.
Aaron Bertrand
Kann das vorübergehende Deaktivieren von FK-Einschränkungen die Abfrage verbessern?
Lev Z
3

Es gibt einige Hinweise, aber welche Version verwenden Sie? Ist es Enterprise Edition? Wie auch immer:

  1. Wenn Sie können, verschieben Sie das Transaktionsprotokoll auf eine schnellere Festplatte
  2. Analysieren Sie das Wo . Wird ein Index verwendet, um zu löschende Datensätze zu identifizieren? Wenn nicht, können Sie einen Index hinzufügen?
  3. Haben Sie einen Index für die Tabelle, den Sie löschen können? Wenn ja, lassen Sie sie fallen.
  4. Haben Sie Fremdschlüssel gegenüber dieser Tabelle? Diese können das Löschen wirklich verlangsamen.
  5. Wenn Sie eine Enterprise Edition haben und der Engpass Festplatten-E / A ist, kann eine Komprimierung auf Zeilenebene Ihnen ein wenig helfen (oder auch nicht, abhängig von Ihren Daten).
  6. Können Sie die Tabelle partitionieren? Lokale Indizes und das Löschen von Partitionen können schneller sein.
  7. Untersuchen Sie mithilfe des Aktivitätsmonitors, wo ein Engpass liegt.

Fügen Sie Details hinzu, wenn Sie mit einer großen Datenbank arbeiten, gibt es keine einzige gültige Antwort.

user_0
quelle
0

Sie sollten versuchen, sie Block für Block zu löschen, wahrscheinlich in einer Schleife zu löschen, jede Löschiteration ist eine eigene Transaktion und dann das Protokoll am Ende jeder Schleifeniteration zu löschen.

Außerdem müssten Sie die Nummer finden, die Sie als Wert in Chunk zum Löschen der Datensätze verwenden möchten. Es erfordert ein gründliches Testen. Besser wäre es, wenn Sie zuerst den Blockwert in UAT testen können.

Informationen zum weiteren Vorgehen finden Sie unter Aufteilen großer Löschvorgänge in Blöcke

KASQLDBA
quelle
0

Das Löschen kann langsam sein, wenn die große Tabelle einen rekursiven Fremdschlüssel enthält.

Wenn dies der Fall ist, suchen Sie nach einer geeigneten Zeit, deaktivieren Sie abhängige Dienste, deaktivieren Sie den rekursiven Fremdschlüssel, führen Sie einen massiven Löschvorgang durch und stellen Sie den Fremdschlüssel erneut wieder her.

obratim
quelle
Das war genau mein Fall. Es ist ein bisschen riskant, die Verhinderung zu deaktivieren, aber das Löschen ging von 1 Zeile / Sekunde auf 500 / Sekunde
Jurion
0

Ein paar weitere Punkte hinzufügen ...

  1. Überprüfen Sie, ob das Prädikat einen Index enthält, und zeigen Sie auch Statistiken an.
  2. Wenn Sie eine große Anzahl von Zeilen löschen und auch keine temporäre Tabellenoption möchten. Gehen Sie fürtablock Option.
  3. Überprüfen Sie, ob Sie Trigger haben, insbesondere nach dem Löschen von Triggern.

Um weitere Hilfe zu erhalten, senden Sie die von Ihnen verwendete Abfrage, Tabelleninformationen und blockierende Informationen.

TheGameiswar
quelle