Impostazione READ UNCOMMITTED durante la lettura di DMV


12

Ho visto diverse persone chiamare SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDprima di leggere i DMV di sistema. C'è mai motivo di farlo, supponendo che non si stiano mescolando chiamate a DMV e tabelle nella stessa transazione?


1
Hai in mente DMV specifici? (Un esempio che ho notato di recente è stato qui sqlskills.com/blogs/jonathan/… )
Martin Smith

Dal momento che Jonathan lo sta facendo, sospetto che ci debba essere una ragione in alcune circostanze. ☺ Ciò che mi ha spinto a porre la domanda è stato vederlo in una query che si è unita sys.dm_exec_query_statsa sys.dm_exec_sql_texte sys.dm_exec_query_plan.
James L,

Risposte:


11

Mentre uno dei ragazzi scrive query DMV in quel modo, spiegherò perché.

Importa se stai solo interrogando i DMV? No. Ma prima o poi, prenderai uno dei tuoi script DMV e ti unirai a un join a database sys.sys.tables o ad altri oggetti di sistema al fine di ottenere maggiori informazioni su ciò che stai guardando. Se non hai letto senza commit, puoi essere bloccato da altre query e bloccare altre query. Sono stato bruciato più volte da quello, quindi uso READ UNCOMMITTED di default ogni volta che faccio qualsiasi lavoro diagnostico.


1
@MartinSmith ci è voluto un po ', ma alla fine ho fatto un blog su quante funzioni dei metadati ignorano il livello di isolamento . Ho cercato di ripulire un sacco del mio codice, ma qualcosa di nuovo che ho sviluppato da allora preferisce unisce piuttosto che built-in come OBJECT_ID(), SCHEMA_NAME()e così via
Aaron Bertrand

7

Non vedo che faccia alcuna differenza.

Se provo quanto segue e confronto l'output di blocco per entrambi i livelli di isolamento in Winmerge, sono esattamente gli stessi (e persino impostarlo per SERIALIZABLEnon modificare l'output).

/*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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.