Hat SQL Server eine einfache Möglichkeit, Metriken darüber abzurufen, wie viele (und möglicherweise welche Art von) Sperren eine bestimmte Abfrage im Verlauf ihrer Ausführung aufgehoben hat?
Begründung ...
Ich bin gerade dabei, eine ziemlich unangenehme gespeicherte Prozedur neu zu schreiben, bei der Cursor häufig verwendet werden. Eine satzbasierte Lösung ist möglich, und als Ergebnis habe ich drei Versionen: das Original, eine satzbasierte Version mit Tabellenvariablen und eine satzbasierte Version, die ausschließlich auf CTE basiert. Ich erhalte gute Messdaten für die CTE-basierte Lösung, aber aufgrund der Größe und Komplexität der von der CTE-Version erstellten Abfrage bin ich vorsichtig, sie freizugeben, bis ich so viel Sorgfalt wie möglich darauf verwendet habe.
Jetzt ist mir klar, dass die SQL-Sperren diejenigen sind, von denen es glaubt, dass sie zu einem bestimmten Zeitpunkt entfernt werden müssen, und auf einem geladenen Produktionsserver verhält es sich möglicherweise anders, aber ich hoffe, es gibt mir ein Gefühl dafür, wie es wird sich verhalten.
Derzeit verwende ich den Profiler und halte Transaktionen offen, damit ich sie ausführen kann. sp_lock
Ich habe mich jedoch gefragt, ob mir in SQL Server 2008 ein Trick fehlt.
Alternativ versuche ich mich davon zu überzeugen, dass der Profiler, der beim Einfügen in eine Tabellenvariable eine hohe Anzahl von Lesevorgängen zurückgibt, in Ordnung ist (für einen bestimmten Wert von okay), aber ich habe mich selbst nicht überzeugt. Die CTE-Lösung hat die Hälfte der Lesevorgänge der table-var-Version, und die hohe Lesezahl der table-var-Version scheint nur auf die Einfügungen zurückzuführen zu sein. In Bezug auf die Dauer sind sowohl der CTE als auch die Tabelle var one ungefähr gleich, wodurch die Ausführungszeiten etwa 150 bis 200% schneller sind als beim cursorbasierten Ansatz.
quelle
sys.fn_trace_gettable
. Haben Sie auch eine#temp
Tabelle ausgewertet ?fn_trace_gettable
; habe es schon einmal benutzt, aber benutze es nicht oft genug, um dich daran zu erinnern, werde das untersuchen, ta.Antworten:
Erweiterte Ereignisse mit Histogrammziel , Ereigniszählerziel oder Bucketizer-Ziel. Sie können mit dem Beispiel Gewusst wie: Finden der Objekte mit den meisten Sperren auf MSDN beginnen, das fast genau das bietet, was Sie möchten. Sie können das Beispiel ändern, um die Sperrtypen zu erhalten (das Beispiel "wie es ist" filtert S- und U-Sperren heraus) und Sie können es so verfeinern, dass es pro Sitzung usw. filtert.
Abgesehen davon muss ich darauf hinweisen, dass es höchst ungewöhnlich ist, sich einer Leistungsuntersuchung durch Zählen der erworbenen Schlösser zu nähern. Der Fokus liegt normalerweise auf Wartestatistiken, wie in der Methode " Warten und Warteschlangen" beschrieben . In Beispiel zum Erfassen von Wartestatistiken für einen einzelnen Vorgang erfahren Sie, wie Sie mit Extended Events erneut die relevanten Informationen für eine bestimmte Abfrage erfassen.
Wenn Sie jedoch Bedenken hinsichtlich Sperren unter dem Gesichtspunkt der Parallelität haben (werden die neuen CTEs aufgrund von Sperren mehr Konflikte verursachen?), Würde ich empfehlen, die Bereitstellung der Snapshot-Isolation zu untersuchen .
quelle
Nehmen Sie die Seite der Abfrage, wenn sie ausgeführt wird, und schließen Sie sie an sys.dm_tran_locks an .
quelle