Установка READ UNCOMMITTED при чтении DMV

12

Я видел, как несколько человек звонили, SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDпрежде чем читать системные DMV. Есть ли какая-либо причина для этого, если вы не смешиваете вызовы к DMV и таблицам в одной транзакции?

Джеймс Л
источник
1
У вас есть какие-то особые DMV? (Один пример, который я недавно заметил, был здесь sqlskills.com/blogs/jonathan/… )
Martin Smith
Поскольку Джонатан делает это, я подозреваю, что в некоторых обстоятельствах должна быть причина. ☺ Что побудило меня задать вопрос, так это увидеть его в запросе, который присоединился sys.dm_exec_query_statsк sys.dm_exec_sql_textи sys.dm_exec_query_plan.
Джеймс Л

Ответы:

11

Когда один из ребят так пишет демо-запросы DMV, я объясню почему.

Имеет ли значение, что вы запрашиваете только DMV? Нет. Но рано или поздно вы возьмете один из ваших сценариев DMV и присоединитесь к sys.databases или sys.tables или другому системному объекту, чтобы получить больше информации о том, на что вы смотрите. Если вы не прочитали незафиксированные данные там, вы можете заблокировать другие запросы и заблокировать другие запросы. Меня это постоянно сжигало, поэтому я просто использую READ UNCOMMITTED по умолчанию всякий раз, когда выполняю какую-либо диагностическую работу.

Брент Озар
источник
1
@MartinSmith это заняло некоторое время, но в конце концов я написал блог о том, как много функций метаданных игнорируют уровень изоляции . Я пытался очистить большую часть своего кода, но все новое, что я разработал с тех пор, предпочитает объединения, а не встроенные модули, как OBJECT_ID(), SCHEMA_NAME()и т. Д.
Аарон Бертран
7

Я не вижу, что это имеет значение.

Если я попробую следующее и сравню выходные данные блокировки для обоих уровней изоляции в winmerge, они абсолютно одинаковы (и даже установка этого значения SERIALIZABLEне изменит выход).

/*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);
Мартин Смит
источник