Einstellung von READ UNCOMMITTED beim Lesen von DMVs

12

Ich habe gesehen, wie mehrere Leute angerufen haben, SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDbevor sie System-DMVs gelesen haben. Gibt es jemals einen Grund, dies zu tun, vorausgesetzt, Sie mischen nicht Aufrufe von DMVs und Tabellen in derselben Transaktion?

James L
quelle
1
Haben Sie spezielle DMVs im Sinn? (Ein Beispiel, das mir kürzlich aufgefallen ist, ist sqlskills.com/blogs/jonathan/… )
Martin Smith
Da Jonathan es tut, muss es unter Umständen einen Grund geben. ☺ Was mich dazu veranlasste die Frage sah es in einer Abfrage zu stellen , die verbunden sys.dm_exec_query_statszu sys.dm_exec_sql_textund sys.dm_exec_query_plan.
James L

Antworten:

11

Da einer der Jungs auf diese Weise Demo-DMV-Abfragen schreibt, erkläre ich, warum.

Ist es wichtig, wenn Sie nur DMVs abfragen? Nein. Aber früher oder später werden Sie eines Ihrer DMV-Skripte nehmen und einen Join zu sys.databases oder sys.tables oder einem anderen Systemobjekt anheften, um mehr Informationen über das zu erhalten, was Sie suchen. Wenn Sie dort nicht unverbindlich gelesen haben, können Sie von anderen Abfragen blockiert werden und andere Abfragen blockieren. Das hat mich immer wieder verbrannt, daher verwende ich standardmäßig immer dann READ UNCOMMITTED, wenn ich irgendwelche Diagnosearbeiten mache.

Brent Ozar
quelle
1
@MartinSmith Es hat eine Weile gedauert, aber ich habe schließlich darüber gebloggt, wie viele der Metadatenfunktionen die Isolationsstufe ignorieren . Ich habe versucht , eine Menge von meinem Code zu bereinigen, aber nichts Neues ich entwickelt habe seitdem bevorzugt schließt sich eher als Einbauten wie OBJECT_ID(), SCHEMA_NAME()usw.
Aaron Bertrand
7

Ich sehe keinen Unterschied.

Wenn ich Folgendes versuche und die Sperrausgabe für beide Isolationsstufen in winmerge vergleiche, sind sie genau gleich (und selbst wenn ich sie so einstelle, dass sich SERIALIZABLEdie Ausgabe nicht ändert).

/*Do once so compilation and caching out the way*/
EXEC('select st.text, qp.query_plan, cp.cacheobjtype, cp.objtype, cp.plan_handle
from sys.dm_exec_cached_plans cp 
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
cross apply sys.dm_exec_query_plan(cp.plan_handle) qp')

DBCC TRACEON(1200,3604,-1);

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
PRINT 'READ COMMITTED'
EXEC('select st.text, qp.query_plan, cp.cacheobjtype, cp.objtype, cp.plan_handle
from sys.dm_exec_cached_plans cp 
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
cross apply sys.dm_exec_query_plan(cp.plan_handle) qp')


SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
PRINT 'READ UNCOMMITTED'
EXEC('select st.text, qp.query_plan, cp.cacheobjtype, cp.objtype, cp.plan_handle
from sys.dm_exec_cached_plans cp 
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
cross apply sys.dm_exec_query_plan(cp.plan_handle) qp')

DBCC TRACEOFF(1200,3604,-1);
Martin Smith
quelle