Wie unterscheiden sich diese beiden Rollbacks in SQL Server 2008 R2?
Führen Sie
ALTER
einige Minuten lang eine Anweisung aus und klicken Sie dann auf "Ausführung abbrechen". Das vollständige Zurücksetzen dauert einige Minuten.Führen Sie dieselbe
ALTER
Anweisung aus, stellen Sie jedoch sicher, dass dieLDF
Datei nicht groß genug ist, um erfolgreich abgeschlossen zu werden. Sobald dasLDF
Limit erreicht ist und kein "Autogrowth" mehr zulässig ist, wird die Ausführung der Abfrage mit der folgenden Fehlermeldung sofort gestoppt (oder ein Rollback wird durchgeführt):
The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full.
To find out why space in the log cannot be reused, see the
log_reuse_wait_desc column in sys.databases
Wie unterscheiden sich diese beiden in den folgenden Punkten?
Warum erfolgt das zweite Zurücksetzen sofort? Ich bin nicht ganz sicher, ob es ein Rollback genannt werden könnte. Ich vermute, das Transaktionsprotokoll wird im Verlauf der Ausführung geschrieben, und sobald festgestellt wird, dass nicht genügend Speicherplatz vorhanden ist, um die Aufgabe vollständig abzuschließen, wird es nur mit einer Endmeldung ohne Festschreibung angehalten.
Was passiert, wenn der erste Rollback so viel Zeit in Anspruch nimmt (ist ein Rollback Single Thread)?
2.1. Geht SQL Server zurück und macht die in derLDF
Datei vorgenommenen Einträge rückgängig ?
2.2. DieLDF
Dateigröße wird am Ende des Rollbacks kleiner (vonDBCC SQLPERF(LOGSPACE)
)Eine weitere Frage: Während des zweiten Szenarios beginnt SQL Server
LDF
ziemlich schnell , Dateien zu verbrauchen . In meinem Fall stieg die Auslastung in den ersten Minuten (<4 Minuten) von 18% auf 90%. Sobald es 99% erreicht hatte, blieb es dort für weitere 8 Minuten, während der Verbrauch zwischen 99,1% und 99,8% schwankte. Es steigt (99,8%) und sinkt (99,2%) und steigt (99,7%) und sinkt (99,5%) einige Male, bevor der Fehler ausgelöst wird. Was passiert hinter den Kulissen?
Alle MSDN-Links, die dies näher erläutern könnten, sind willkommen.
Auf Vorschlag von Ali Razeghi füge ich perfmon hinzu: Disk Bytes/sec
Antworten:
Wie oben angegeben, bin ich nach weiteren Tests zu einem kalkulierten Ergebnis gekommen. Ich habe alle in einem Blogbeitrag zusammengefasst , aber ich werde einige Inhalte für die Nachwelt in diesen Beitrag kopieren.
Vermutung (basierend auf einigen Tests)
Derzeit habe ich keine klare Erklärung, warum dies so ist. Es folgen jedoch meine Schätzungen, die auf den Artefakten basieren, die während der Tests gesammelt wurden.
Rollback erfolgt in beiden Szenarien. Einer ist explizites Rollback (Benutzer drückt auf Abbrechen), der andere ist implizit (SQL Server trifft diese Entscheidung intern).
In beiden Szenarien ist der Datenverkehr zur Protokolldatei konsistent. Siehe die Bilder unten:
Szenario 1:
Szenario 2:
Ein Artefakt, das diese Denkweise verstärkt hat, ist die Erfassung von SQL Trace in beiden Szenarien.
Unerklärtes Verhalten:
Anregungen zur besseren Erklärung dieses Verhaltens sind willkommen.
quelle
Ich habe das folgende Experiment ausprobiert und ähnliche Ergebnisse erhalten. In beiden Fällen zeigt fn_dblog (), dass ein Rollback stattfindet, und dies scheint in Szenario 2 schneller zu geschehen als in Szenario 1.
Übrigens habe ich sowohl MDF als auch LDF auf derselben externen Festplatte (USB 2.0) abgelegt.
Meine anfängliche Schlussfolgerung ist, dass es in diesem Fall keinen Unterschied in der Funktionsweise des Rollbacks gibt, und wahrscheinlich ist jeder offensichtliche Geschwindigkeitsunterschied auf das E / A-Subsystem zurückzuführen. Das ist im Moment nur meine Arbeitshypothese.
Szenario 1:
Szenario 2:
Ergebnisse der Leistungsüberwachung:
Szenario 1:
Szenario 2:
Code:
quelle