web-dev-qa-db-ja.com

DMVの読み取り時にREAD UNCOMMITTEDを設定する

何人かがSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDシステムDMVを読み取る前。同じトランザクションでDMVとテーブルへの呼び出しを混在させないと想定して、これを行う理由はありますか?

12
James L

男の1人がデモDMVクエリをそのように書いているので、その理由を説明します。

only DMVをクエリしている場合、問題はありますか?いいえ。遅かれ早かれ、DMVスクリプトの1つを取得して、sys.databasesやsys.tables、またはその他のシステムオブジェクトへの結合を追加して、見ているものに関する詳細情報を取得します。そこにコミットされていない読み取りがない場合は、他のクエリによってブロックされ、他のクエリをブロックできます。私は何度もそれによって火傷を負ったので、診断作業を行うときはいつでも、デフォルトでREAD UNCOMMITTEDを使用します。

11
Brent Ozar

それが違いを生むとは思いません。

以下を試して、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);
7
Martin Smith