DMVを読み取るときにREAD UNCOMMITTEDを設定する


12

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


1
特定のDMVを念頭に置いていますか?(最近気づいた1つの例は、ここsqlskills.com/blogs/jonathan/…でした
マーティンスミス

ジョナサンはそれをやっているので、状況によっては理由があるに違いないと思う。☺質問が参加し、クエリでそれを見ていた尋ねるために私を促した何sys.dm_exec_query_statssys.dm_exec_sql_textしてsys.dm_exec_query_plan
ジェームズL

回答:


11

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

あなたがいるならそれは重要ですか DMV のみを照会なりますか?いいえ。しかし、遅かれ早かれ、DMVスクリプトの1つを使用して、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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.