Configurando READ UNCOMMITTED ao ler DMVs

12

Eu já vi várias pessoas ligando SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDantes de ler os DMVs do sistema. Existe alguma razão para fazer isso, supondo que você não esteja misturando chamadas para DMVs e tabelas na mesma transação?

James L
fonte
1
Você tem algum DMV específico em mente? (Um exemplo que eu notei recentemente estava aqui sqlskills.com/blogs/jonathan/... )
Martin Smith
Como Jonathan está fazendo isso, suspeito que deve haver uma razão em algumas circunstâncias. ☺ O que me levou a fazer a pergunta foi vê-la em uma consulta que se juntou sys.dm_exec_query_statsa sys.dm_exec_sql_texte sys.dm_exec_query_plan.
James L

Respostas:

11

Enquanto um dos caras escreve consultas DMV de demonstração dessa maneira, vou explicar o porquê.

Importa se você está apenas consultando DMVs? Não. Mas, mais cedo ou mais tarde, você pegará um de seus scripts DMV e aderirá a uma associação a sys.databases ou sys.tables ou algum outro objeto do sistema para obter mais informações sobre o que está vendo. Se você ainda não leu a confirmação, pode ser bloqueado por outras consultas e bloquear outras consultas. Fui queimado repetidamente por isso, então só uso LEITURA NÃO COMPROMETIDA por padrão sempre que estou fazendo algum trabalho de diagnóstico.

Brent Ozar
fonte
1
@MartinSmith demorou um tempo, mas acabei por publicar um blog sobre quantas funções de metadados ignoram o nível de isolamento . Eu tentei limpar um monte de meu código, mas nada de novo tenho desenvolvido desde então prefere se junta ao invés de built-ins, como OBJECT_ID(), SCHEMA_NAME(), etc.
Aaron Bertrand
7

Não vejo que isso faça alguma diferença.

Se eu tentar o seguinte e comparar a saída de bloqueio para os dois níveis de isolamento no winmerge, eles são exatamente os mesmos (e até a colocação deles SERIALIZABLEnão altera a saída).

/*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
fonte