【问题标题】:SQL Server LCK_M_S only happens in productionSQL Server LCK_M_S 仅在生产中发生
【发布时间】:2014-05-28 06:49:14
【问题描述】:
我有一个由 SQL Server 2012 报告调用的存储过程,由于阻塞会话lck_m_s
,与开发相比,该报告在生产中运行需要一段时间
存储过程在 SQL Server Management Studio 中执行时会立即运行,并且在通过 Visual Studio 从开发笔记本电脑作为报告的一部分调用时也能正常运行。
当报告上传到生产服务器时,会出现此阻塞问题。
在生产过程中如何找出导致lck_m_s 问题的原因?
【问题讨论】:
标签:
sql
sql-server
reporting-services
sql-server-2012
blocking
【解决方案1】:
当问题再次发生时执行此查询:
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、阻塞的资源以及该会话的最近查询的文本。这应该会给你一个坚实的起点。
【解决方案2】:
你有几个选择
设置阻塞进程报告。本质上,您将blocked process threshold (s) 系统配置设置为非零秒数,并在BLOCKED_PROCESS_REPORT 事件上设置事件通知。每次任何进程被阻止超过您设置的阈值时,您都会收到一份 XML 报告。这样做的缺点是,它会针对任何被阻止的东西,而不仅仅是您的程序,而且您会找到在报告中持有不兼容锁定的任何人。
为您的过程设置一个扩展的事件会话,以捕获持续时间长于您愿意等待的lock_released 事件。好处是这是非常有针对性的,你可以定义会话,这样你就可以得到很少的噪音。缺点是您不知道哪个进程持有不兼容的锁(尽管您将获得关于锁定资源的非常详细的描述以进一步调查)。