我有一个SQL Server 2012报告调用的存储过程,由于阻塞会话lck_m_s
存储过程在SQL Server Management Studio中执行时即时运行,并且当通过Visual Studio从开发笔记本电脑作为报告的一部分调用时也可以正常运行。
当报告上传到生产服务器时,会出现阻止问题。
如何在生产中找出导致lck_m_s
问题的原因?
答案 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)
你有几个选择
设置阻止的流程报告。实质上,您将blocked process threshold (s)
系统配置设置为非零秒数,并在BLOCKED_PROCESS_REPORT
事件上设置事件通知。每当任何进程被阻止超过您设置的阈值时,您都会收到XML报告。这样做的缺点是它会被阻止的任何东西,而不仅仅是你的程序,但是你会在报告中拿到不兼容的锁。
为您的程序设置一个扩展事件会话,以捕获持续时间比您要等待的时间长的lock_released
事件。好处是,这是非常有针对性的,您可以定义会话,以便您获得非常小的噪音。缺点是你不知道什么进程持有不兼容的锁(尽管你会得到一个非常详细的描述锁定资源是什么来进一步调查)。