读取DMV时将READ UNCOMMITTED设置为


12

我已经看到几个人SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在阅读系统DMV之前先打过电话。假设没有在同一事务中混合调用DMV和表,是否有任何理由这样做?


1
您是否有任何特定的DMV?(我注意到最近的一个例子就是在这里sqlskills.com/blogs/jonathan/...
马丁·史密斯

由于乔纳森(Jonathan)这样做,我怀疑在某些情况下一定有原因。prompted促使我问这个问题的原因是,在sys.dm_exec_query_statssys.dm_exec_sql_text和连接的查询中看到了该问题sys.dm_exec_query_plan
James L

Answers:


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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.