Schreiben SQL Server-Datenbanken mit Snapshot-Isolation langsamer?

8

Ich habe viele Deadlocks in meinem System.

Ich möchte Snapshot Isolation verwenden, um sie zu beheben, aber mein DBA verfügt über Reserven.

Eines seiner Probleme ist, dass Snapshot Isolation das Schreiben verlangsamt. Dies liegt daran, dass es in den Cache und dann in die TempDb (Zeilenversion) schreiben muss und dann zum Aufrufer zurückkehren kann.

Ein "normaler" Schreibvorgang kann einfach in den Cache schreiben und dann ausgeführt werden.

Funktioniert die Zeilenversionierung so? Oder ist es komplexer als das? Tut es das irgendwie parallel?

Oder sind Schreibvorgänge mit Snapshot Isolation langsamer?

Vaccano
quelle
2
Ein Problem, auf das Sie achten müssen, wenn Sie die Snapshot-Isolation aktivieren: Ihre Zeilengröße wird um 14 Byte erhöht. Stellen Sie sicher, dass Sie diese Kapazitätserhöhung und die daraus resultierenden Seitenaufteilungen geplant haben.
Stanley Johns

Antworten:

14

Dies liegt daran, dass es in den Cache und dann in die TempDb (Zeilenversion) schreiben muss und dann zum Aufrufer zurückkehren kann.

Nein, das ist falsch. Dies impliziert irgendwie, dass Schreibvorgänge bei vorhandener Versionierung eine höhere Latenz haben, da jeder Schreibvorgang die Festplatte berühren muss (für Tempdb), was nicht der Fall ist. Das Schreiben in die Tempdb ist auch ein Schreiben in den 'Cache'. Das einzige 'Warten' tritt zur COMMIT-Zeit auf, wenn das Protokoll gehärtet werden muss. Es stimmt, dass bei der Versionierung sowohl das DB-Protokoll als auch das Tempdb-Protokoll gehärtet werden müssen, dies bedeutet jedoch nicht unbedingt eine höhere Latenz (die E / A sollte auf verschiedenen Speicherpfaden parallel sein, die Tempdb wird auf einem separaten Laufwerk von Ihrem häufig verwendeten LDF gespeichert. Recht?). Eine ausführliche Erklärung finden Sie unter Funktionsweise: Bob Dorrs SQL Server-E / A-Präsentation Ich hoffe wirklich, dass Ihr DBA dies besser versteht, als Sie es hier vermitteln.

Wie ich in Ihrem anderen Beitrag erwähnt habe: Snapshot hat keine Kosten für INSERTS und die Kosten für Updates und Löschungen können leicht gesenkt werden. Die Ressourcennutzung bei der Zeilenversionierung erläutert die Kompromisse. Zu diesem Zeitpunkt sollten Sie wahrscheinlich mit einer realistischen Arbeitsbelastung testen, was der einzige Weg ist , um richtig die Auswirkungen beurteilen Sie würden erleben.

Remus Rusanu
quelle
4
Übrigens: Haben Sie oder Ihr DBA in den letzten 7 Jahren jemals Trigger verwendet? Seit SQL 2005 werden Trigger mithilfe eines Snapshots hinter den Kulissen implementiert. Gleiches gilt, wenn Sie jemals die Online-Indexwiederherstellung oder MARS verwendet haben . Wie wäre es, wenn Sie jetzt sys.dm_db_file_space_usageauf Ihrem Produktionsserver nachsehen. Wenn version_store_reserved_page_countungleich Null ist, verwenden Sie bereits den Versionsspeicher .
Remus Rusanu
Ich glaube nicht, dass das Tempdb-Protokoll jemals gehärtet werden muss, da Redo niemals auf Tempdb ausgeführt wird. Der Overhead ist also noch geringer.
usr
0

Ich glaube, es gibt andere Probleme in der Anwendung, wenn Sie Deadlocks bekommen. Die Snapshot-Isolation hilft normalerweise dabei, Wartesperren zu reduzieren, aber die Wurzel von Deadlocks sind normalerweise verschiedene Zugriffsmethoden in der Anwendung, die verhindert werden sollten, indem ein konsistentes Muster eingehalten wird. Diskussionen über Deadlocks sind kompliziert und es gibt viele Ressourcen, die ihnen gewidmet sind.

Ihr DBA hat zu Recht Bedenken, die Isolationsstufe in Snapshot zu ändern, da dies die Belastung der TempDB erhöht. Ich empfehle generell, die Snapshot-Isolation zu verwenden, aber ich denke, das ist nur ein Teil der Behebung Ihrer Deadlocks. Es kann zu schmutzigen Schreibvorgängen kommen, bei denen eine Transaktion Zeile A und dann B und eine andere Transaktion Zeile B und dann A aktualisiert.

Robert-Ryan.
quelle