Ich versuche, ein Blockierungsproblem zu beheben, das weniger als eine Sekunde dauert. Die OLTP-Anwendung ist sehr sensibel und muss für einige Transaktionen eine Antwortzeit von weniger als 200 ms gemäß dem vereinbarten SLA haben. Wir hatten einige Probleme mit der Eskalation von Sperren mit der neuen Codeversion, die wir durch die Reduzierung der Stapelgröße in den Updates beheben konnten. Selbst mit der geringen Stapelgröße vermuten wir, dass der neue SP dieselben Zeilen blockiert, die von den OLTP-Transaktionen aktualisiert werden.
Ich muss die Sitzung finden, die blockiert wird, und die Ressource, auf die gewartet wird. Nach meinem Verständnis kann die "Schwelle für blockierten Prozess" für mindestens 1 Sekunde festgelegt werden, sodass die Blockierung nicht erfasst wird.
Ich experimentiere mit den Ereignissen wait_info und wait_completed x.
Gibt es eine andere Möglichkeit, dies zu verfolgen? Vielen Dank
Antworten:
Da Sie sich speziell für das Sperren und nicht für das allgemeine Warten interessieren, ist das
locks_lock_waits
erweiterte Ereignis besser geeignet.Mit eingeschaltetem Filter
increment >= 200
Das oben Gesagte sammelt die Anweisungen, die auf Sperren für den Schwellenwert warten, gibt aber nicht die spezifische Sperrressource an.
Ich habe dieses Ereignis noch nie verwendet und weiß nicht, wie viel Overhead diese Sitzung auf Ihrem Produktionsserver verursachen würde.
Ich habe dieses Video zum Thema gefunden. Es wird dringend empfohlen, nach zu filtern
counter
, um die Anzahl der erfassten Ereignisse zu verringern.Es wird auch ein altes, nicht dokumentiertes Legacy-Kommando erwähnt
Wobei (wenn das Ablaufverfolgungsflag 3605 aktiviert ist) begrenzte Informationen wie die folgenden in das SQL Server-Fehlerprotokoll ausgegeben werden.
Ich erwähne dies nur beiläufig, da ausgedehnte Veranstaltungen sowieso eindeutig vorzuziehen sind, da sie dokumentiert und viel leistungsfähiger sind.
quelle
dbcc lock(StallReportThreshold, 200)
zuerst ausgeführt und geben die Informationen aus, sobald der Schwellenwert überschritten wird, solange das Ablaufverfolgungsflag 3605 aktiviert ist. SQL Server sammelt diese Informationen nicht, nur für den Fall, dass Sie sie später ausführen.Wenn Sie sich für das Sperren interessieren, stehen Ihnen mehrere erweiterte Ereignisse zur Verfügung:
Die ersten beiden Ereignisse haben eine
duration
Spalte in (Mikrosekunden), nach der Sie nach Ihren Schwellenwerten filtern können. Sie haben auch eineresource_description
Aktion, die Ihnen einige Details zu den beteiligten Ressourcen gibt.Das
lock_escalation
Ereignis verfügt auch über einestatement
Aktion, die Sie hinzufügen können, um die T-SQL-Anweisung zu erfassen, die die Sperreneskalation ausgelöst hat. Es hat auchescalation_cause
. Hier ist eine Beispielsitzung:Ich vermute, dass es wahrscheinlich einen Grund gibt, warum Sie den Schwellenwert für blockierte Prozessberichte nicht auf weniger als eine Sekunde festlegen können: Das Sperren ist in einem RDBMS völlig normal - das Datenbankmodul muss Ressourcen sperren, um sie zu schützen. Obwohl es keine offizielle Definition gibt, wann das Sperren blockiert wird, erscheint mir das Sperren in Sekundenbruchteilen normal.
quelle