Configuración de LEER SIN COMPROMISO al leer DMV


12

He visto a varias personas llamar SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDantes de leer los DMV del sistema. ¿Hay alguna razón para hacer esto, suponiendo que no esté mezclando llamadas a DMV y tablas en la misma transacción?


1
¿Tienes algún DMV específico en mente? (Un ejemplo que noté recientemente fue aquí sqlskills.com/blogs/jonathan/… )
Martin Smith

Como Jonathan lo está haciendo, sospecho que debe haber una razón en algunas circunstancias. ☺ Lo que me llevó a hacer la pregunta fue verla en una consulta que se unió sys.dm_exec_query_statsa sys.dm_exec_sql_texty sys.dm_exec_query_plan.
James L

Respuestas:


11

Como uno de los chicos escribe consultas de demostración de DMV de esa manera, explicaré por qué.

¿Importa si solo está consultando DMV? No. Pero tarde o temprano, tomará uno de sus scripts del DMV y agregará una unión a sys.databases o sys.tables o algún otro objeto del sistema para obtener más información sobre lo que está viendo. Si no ha leído sin confirmar allí, puede ser bloqueado por otras consultas y bloquear otras consultas. Eso me ha quemado repetidamente, por lo que solo uso READ UNCOMMITTED de forma predeterminada cada vez que hago algún trabajo de diagnóstico.


1
@MartinSmith tardó un tiempo, pero eventualmente hice un blog sobre cuántas de las funciones de metadatos ignoran el nivel de aislamiento . He tratado de limpiar un montón de mi código, pero nada nuevo que he desarrollado desde entonces prefiere une en lugar de muebles empotrados como OBJECT_ID(), SCHEMA_NAME(), etc.
Aaron Bertrand

7

No veo que haga ninguna diferencia.

Si intento lo siguiente y comparo la salida de bloqueo para ambos niveles de aislamiento en winmerge, son exactamente iguales (e incluso ponerlo en marcha SERIALIZABLEno cambia la salida).

/*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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.