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.
fn_trace_gettable
; habe es schon einmal benutzt, aber benutze es nicht oft genug, um dich daran zu erinnern, werde das untersuchen, ta.
sys.fn_trace_gettable
. Haben Sie auch eine#temp
Tabelle ausgewertet ?