Встановлення ЧИТАТИ НЕЗАБАВЛЕНО, читаючи DMV


12

Я бачив, як кілька людей дзвонять, SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDперш ніж читати DMV-системи. Чи є коли-небудь причина для цього, якщо припустити, що ви не змішуєте дзвінки на DMV та таблиці в одній транзакції?


1
Чи є на увазі якісь конкретні DMV? (Один із прикладів, який я нещодавно помітив, тут був sqlskills.com/blogs/jonathan/… )
Мартін Сміт

Оскільки Джонатан це робить, я підозрюю, що в деяких обставинах повинна бути причина. ☺ Що підштовхнуло мене до запитання, це побачило його у запиті, який приєднався sys.dm_exec_query_statsдо sys.dm_exec_sql_textта sys.dm_exec_query_plan.
Джеймс Л

Відповіді:


11

Оскільки один із хлопців таким чином пише демо-запити DMV, я поясню, чому.

Чи має значення, якщо ви лише запитуєте DMV? Ні. Але рано чи пізно, ви збираєтесь взяти один із своїх сценаріїв DMV і приєднатись до приєднання до sys.datababases або sys.tables чи іншого системного об'єкта, щоб отримати більше інформації про те, що ви дивитесь. Якщо ви ще не читали там, що не надходять, ви можете заблокувати інші запити та заблокувати інші запити. Мене це неодноразово спалювало, тому я просто використовую ПРОЧИТАЙТЕ НЕЗАПАДНО за замовчуванням, коли я виконую будь-яку діагностичну роботу.


1
@MartinSmith пройшло певний час, але я врешті провів блог про те, скільки функцій метаданих ігнорують рівень ізоляції . Я спробував очистити багато мого коду, але нічого нового я розробив з тих пір вважає за краще з'єднує , а не вбудовані модулі , як OBJECT_ID(), SCHEMA_NAME()і т.д.
Aaron Bertrand

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.