Ustawienie ODCZYTAJ NIEZGODNE z odczytem DMV

12

Widziałem kilka osób dzwoniących SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDprzed przeczytaniem DMV systemu. Czy jest jakiś powód, aby to robić, zakładając, że nie miksujesz połączeń do DMV i tabel w tej samej transakcji?

James L.
źródło
1
Czy masz na myśli jakieś konkretne DMV? (Jednym z przykładów, który niedawno zauważyłem, jest tutaj sqlskills.com/blogs/jonathan/… )
Martin Smith
Ponieważ Jonathan to robi, podejrzewam, że w niektórych okolicznościach musi być jakiś powód. ☺ To, co skłoniło mnie do zadania pytania, to zobaczenie go w zapytaniu, które dołączyło sys.dm_exec_query_statsdo sys.dm_exec_sql_texti sys.dm_exec_query_plan.
James L

Odpowiedzi:

11

Kiedy jeden z facetów napisze w ten sposób zapytania demo DMV, wyjaśnię dlaczego.

Czy to ważne, czy pytasz tylko o DMV? Nie. Ale wcześniej czy później weźmiesz jeden ze skryptów DMV i połączysz się z sys.databases lub sys.tables lub innym obiektem systemowym, aby uzyskać więcej informacji o tym, na co patrzysz. Jeśli nie czytałeś tam niezaangażowanych, możesz zostać zablokowany przez inne zapytania i zablokować inne zapytania. Wielokrotnie mnie to paliło, więc domyślnie po prostu używam CZYTAJ NIEZGODZONE, ilekroć wykonuję jakąkolwiek pracę diagnostyczną.

Brent Ozar
źródło
1
@MartinSmith zajęło trochę czasu, ale ostatecznie napisałem blog o tym, ile funkcji metadanych ignoruje poziom izolacji . Próbowałem oczyścić dużo mojego kodu, ale nic nowego Mam opracowany odtąd preferuje dołącza zamiast wbudowanych wtyczek takich jak OBJECT_ID(), SCHEMA_NAME()itp
Aaron Bertrand
7

Nie widzę, żeby to miało jakąkolwiek różnicę.

Jeśli spróbuję wykonać następujące czynności i porównuję wyjście blokady dla obu poziomów izolacji w winmerge, są one dokładnie takie same (a nawet ich ustawienie SERIALIZABLEnie zmienia wyniku).

/*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
źródło