何人かがSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
システムDMVを読み取る前。同じトランザクションでDMVとテーブルへの呼び出しを混在させないと想定して、これを行う理由はありますか?
男の1人がデモDMVクエリをそのように書いているので、その理由を説明します。
only DMVをクエリしている場合、問題はありますか?いいえ。遅かれ早かれ、DMVスクリプトの1つを取得して、sys.databasesやsys.tables、またはその他のシステムオブジェクトへの結合を追加して、見ているものに関する詳細情報を取得します。そこにコミットされていない読み取りがない場合は、他のクエリによってブロックされ、他のクエリをブロックできます。私は何度もそれによって火傷を負ったので、診断作業を行うときはいつでも、デフォルトでREAD UNCOMMITTEDを使用します。
それが違いを生むとは思いません。
以下を試して、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);