Réglage de READ UNCOMMITTED lors de la lecture de DMV

12

J'ai vu plusieurs personnes appeler SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDavant de lire les DMV du système. Y a-t-il jamais une raison de le faire, en supposant que vous ne mélangez pas les appels aux DMV et aux tables dans la même transaction?

James L
la source
1
Avez-vous des DMV spécifiques en tête? (Un exemple que j'ai remarqué récemment était ici sqlskills.com/blogs/jonathan/… )
Martin Smith
Puisque Jonathan le fait, je soupçonne qu'il doit y avoir une raison dans certaines circonstances. ☺ Ce qui m'a incité à poser la question, c'est de la voir dans une requête jointe sys.dm_exec_query_statsà sys.dm_exec_sql_textet sys.dm_exec_query_plan.
James L

Réponses:

11

Comme l'un des gars écrit des requêtes DMV de démonstration de cette façon, je vais vous expliquer pourquoi.

Est-ce important si vous interrogez uniquement des DMV? Non. Mais tôt ou tard, vous allez prendre l'un de vos scripts DMV et clouer sur une jointure à sys.databases ou sys.tables ou à tout autre objet système afin d'obtenir plus d'informations sur ce que vous regardez. Si vous n'y avez pas lu sans engagement, vous pouvez être bloqué par d'autres requêtes et bloquer d'autres requêtes. J'ai été brûlé par cela à plusieurs reprises, donc j'utilise par défaut READ UNCOMMITTED chaque fois que je fais un travail de diagnostic.

Brent Ozar
la source
1
@MartinSmith, cela a pris du temps, mais j'ai finalement blogué sur le nombre de fonctions de métadonnées qui ignorent le niveau d'isolement . J'ai essayé de nettoyer beaucoup de mon code, mais quelque chose de nouveau que j'ai développé depuis préfère puis rejoint plutôt que Encastrements comme OBJECT_ID(), SCHEMA_NAME(), etc.
Aaron Bertrand
7

Je ne vois pas que cela fasse une différence.

Si j'essaye ce qui suit et compare la sortie de verrouillage pour les deux niveaux d'isolement dans winmerge, ils sont exactement les mêmes (et même le mettre en place SERIALIZABLEne change pas la sortie).

/*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
la source