【问题标题】: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】:

      你有几个选择

      1. 设置阻塞进程报告。本质上,您将blocked process threshold (s) 系统配置设置为非零秒数,并在BLOCKED_PROCESS_REPORT 事件上设置事件通知。每次任何进程被阻止超过您设置的阈值时,您都会收到一份 XML 报告。这样做的缺点是,它会针对任何被阻止的东西,而不仅仅是您的程序,而且您会找到在报告中持有不兼容锁定的任何人。

      2. 为您的过程设置一个扩展的事件会话,以捕获持续时间长于您愿意等待的lock_released 事件。好处是这是非常有针对性的,你可以定义会话,这样你就可以得到很少的噪音。缺点是您不知道哪个进程持有不兼容的锁(尽管您将获得关于锁定资源的非常详细的描述以进一步调查)。

      【讨论】:

        猜你喜欢
        • 2011-04-29
        • 2018-07-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-19
        相关资源
        最近更新 更多