Wie wichtig sind Transaktionsprotokoll-VLFs für die Leistung?

12

Wie wichtig sind VLFs im Hinblick auf die Datenbankleistung? Was würde eine optimale Situation für VLFs beschreiben?

the_good_pony
quelle
Weitere Informationen finden
Max Vernon
Cool - Ich kann sehen, dass dies hilfreich für die Berichterstattung über die Leistung ist
the_good_pony
1
@DBAWaffle Siehe: Experimente mit SQL Server-VLFs, Teil 1 von Glenn Berry -> sqlskills.com/blogs/glenn/…
Kin Shah,

Antworten:

17

Was ist eine virtuelle Protokolldatei?

SQL Server unterteilt die Transaktionsprotokolldatei für jede Datenbank in kleinere Abschnitte, die als "virtuelle Protokolldateien" (kurz VLFs) bezeichnet werden. Ihre Hauptfunktion ist das Abschneiden von Markierungen bei einer Protokollsicherung, dh der SQL Server löscht nur VLFs, die vollständig leer sind (und markiert sie zur Wiederverwendung). MSDN hat einen Beitrag zum Transaktionsprotokoll - Physikalische Architektur .

Was bestimmt die Anzahl der VLFs?

Jedes Mal, wenn eine Protokolldatei wächst (ob durch automatisches oder manuelles Wachstum), wird der neue Abschnitt der Protokolldatei in eine Reihe von VLFs unterteilt, die lediglich auf der Größe des neuen Abschnitts basieren (das vorhandene Transaktionsprotokoll bleibt unberührt). Bei kleinen Einstellungen für das automatische Wachstum (dh dem voreingestellten automatischen Wachstum von 10%) wird daher eine große Anzahl von VLFs erstellt.

Was sind die Auswirkungen einer großen Anzahl von VLFs?

Das Hauptproblem, das eine große Anzahl von VLFs verursacht, sind:

  • Langsame Wiederherstellung (Wiederherstellung ist eine Phase während der Datenbankwiederherstellung, in der abgeschlossene Transaktionen auf die Datenseiten geschrieben und unvollständige Transaktionen zurückgesetzt werden).
  • Langsame Protokolllese-Leistung in einer Datenbankspiegelungskonfiguration.
  • Langsame Leistung bei der Erstellung von Datenbank-Snapshots (Beachten Sie, dass dies auch bestimmte Funktionen umfasst, DBCCda sie Datenbank-Snapshots im Hintergrund verwenden, um Konsistenzprüfungen ohne Blockierung zu ermöglichen).

Wie kann ich herausfinden, wie viele VLFs meine Datenbank enthält?

DBCC LOGINFOgibt 1 Zeile für jede VLF im Transaktionsprotokoll Ihrer Datenbank zurück. Diese Frage enthält einige nützliche Skripts, mit denen Sie diese auf alle Datenbanken auf einem Server anwenden können.

Wie viele VLFs sind zu viele?

Das ist eine Entscheidung, die Sie für sich selbst treffen müssen. Meine persönliche Faustregel ist, dass es sich nicht lohnt, mit unter 50 zu spielen, und über 100 (oder so), und ich korrigiere die Einstellungen für das automatische Wachstum und mache mir eine mentale Notiz (im nächsten Wartungsfenster), das Protokoll zu verkleinern und erneut zu wachsen (siehe unten). .

Hilfe! Ich habe elf Milliarden VLFs und meine Datenbankwiederherstellung dauert den ganzen Tag!

Kurzer Abriss (aus Kimberly Tripps Blog ):

  • Stellen Sie sicher, dass Sie die einzige aktive Verbindung in der Datenbank sind (tun Sie dies also während eines Wartungsfensters).
  • Sichern Sie das Transaktionslog auf Festplatte (mit BACKUP LOG)
  • Führen Sie DBCC SHRINKFILEmit aus TRUNCATEONLY, um die Protokolldatei auf die kleinstmögliche Größe zu verkleinern.
  • Führen Sie aus, ALTER DATABASE [...] MODIFY FILE [...] SIZE=newsizeum die Größe Ihres Transaktionsprotokolls in einem einzigen Schritt zu ändern **.

** Hinweis - Wenn Sie über eine sehr große Protokolldatei (mehrere zehn GB oder mehr) verfügen, möchten Sie möglicherweise die Größe in mehreren Schritten ändern, um eine angemessene Anzahl von VLFs mit einer angemessenen Größe zu erhalten, um übermäßig umfangreiche Protokollsicherungen zu vermeiden. Da VLFs die Kürzungseinheit sind, bestimmen sie auch die Protokollsicherungsgrößen, wie in Kims Blog beschrieben .

Simon Righarts
quelle
Denken Sie, dass mehrere VLFs die Leistung in einer Umgebung mit hohem OLTP-Wert, in der Daten regelmäßig geändert werden, offensichtlich beeinträchtigen und eine große Anzahl von Commits erforderlich ist?
the_good_pony
Eine große Anzahl von VLFs ist nur in den oben beschriebenen Situationen (Wiederherstellung, Snapshots, Spiegelung) wirklich bemerkenswert. Sie können die Leistung in einer OLTP-Umgebung etwas beeinträchtigen, jedoch nur geringfügig.
Simon Righarts
1
Für mich war die Erholung von mehr als 20 Stunden der Grund, warum es wichtig ist, eine niedrige VLF-Zahl (unter 1.000) aufrechtzuerhalten.
Max Vernon
@ SimonRigharts Ich bin neugierig. Beeinträchtigt eine große Anzahl von VLFs die reguläre Transaktionsleistung überhaupt? Oder wirkt es sich nur auf Sicherungen und Wiederherstellungen aus?
Chris Aldrich
@ChrisAldrich Eine Transaktion kann einen winzigen Overhead verursachen, wenn sie sich über eine VLF-Grenze erstreckt (aber wenn ich noch nichts davon gehört habe), aber wie in der Frage ausführlich beschrieben, werden Sie die Auswirkungen von nur einmal bemerken Eine große Anzahl von VLFs wird während der Wiederherstellung, Spiegelung oder Snapshots erstellt.
Simon Righarts