SQL Server LCK_M_S仅在生产中发生

时间:2014-04-14 10:35:41

标签: sql sql-server reporting-services sql-server-2012 blocking

我有一个SQL Server 2012报告调用的存储过程,由于阻塞会话lck_m_s

,因此与开发相比需要在生产中运行一个年龄

存储过程在SQL Server Management Studio中执行时即时运行,并且当通过Visual Studio从开发笔记本电脑作为报告的一部分调用时也可以正常运行。

当报告上传到生产服务器时,会出现阻止问题。

如何在生产中找出导致lck_m_s问题的原因?

2 个答案:

答案 0 :(得分:10)

再次出现问题时执行此查询:

select * from 
sys.dm_os_waiting_tasks t
inner join sys.dm_exec_connections c on c.session_id = t.blocking_session_id
cross apply sys.dm_exec_sql_text(c.most_recent_sql_handle) as h1

它将为您提供导致阻塞的会话的spid,阻止资源的文本以及该会话的最有争议的查询的文本。这应该给你一个坚实的起点。

答案 1 :(得分:0)

你有几个选择

  1. 设置阻止的流程报告。实质上,您将blocked process threshold (s)系统配置设置为非零秒数,并在BLOCKED_PROCESS_REPORT事件上设置事件通知。每当任何进程被阻止超过您设置的阈值时,您都会收到XML报告。这样做的缺点是它会被阻止的任何东西,而不仅仅是你的程序,但是你会在报告中拿到不兼容的锁。

  2. 为您的程序设置一个扩展事件会话,以捕获持续时间比您要等待的时间长的lock_released事件。好处是,这是非常有针对性的,您可以定义会话,以便您获得非常小的噪音。缺点是你不知道什么进程持有不兼容的锁(尽管你会得到一个非常详细的描述锁定资源是什么来进一步调查)。