【问题标题】:Finding blocking/locking queries in MS SQL (mssql)在 MS SQL (mssql) 中查找阻塞/锁定查询
【发布时间】:2011-05-20 22:34:15
【问题描述】:

使用sys.dm_os_wait_stats 我发现了我认为是锁定问题

  wait type    waittime  pct     running ptc
  LCK_M_RS_S   2238.54   22.14   22.14
  LCK_M_S      1980.59   19.59   41.73

有没有办法可以找到最热门的阻塞/锁定查询?我试过查询sys.dm_db_index_operational_stats,但运气不佳。

【问题讨论】:

    标签: sql-server sql-server-2005 sql-server-2008 query-optimization


    【解决方案1】:

    您可能会发现此查询很有用:

    SELECT * 
    FROM sys.dm_exec_requests
    WHERE DB_NAME(database_id) = 'YourDBName' 
    AND blocking_session_id <> 0
    

    【讨论】:

    • 是的,我最终手动并不断按 F5 并使用以下查询“SELECT * FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle) where blocking_session_id 0”
    • 我进一步编辑了语句,所以你总是得到“真正”的罪魁祸首:SELECT * FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle) where session_id IN (SELECT blocking_session_id FROM sys.dm_exec_requests WHERE DB_NAME(database_id)='SDCS20' and blocking_session_id &lt;&gt;0) 一些语句被阻塞是因为它们被其他东西阻塞了,在这种情况下,blocking_session_id 将不同于session_id。
    【解决方案2】:

    我找到了这个查询,它帮助我找到了我的锁定表和导致问题的查询。

    SELECT  L.request_session_id AS SPID, 
            DB_NAME(L.resource_database_id) AS DatabaseName,
            O.Name AS LockedObjectName, 
            P.object_id AS LockedObjectId, 
            L.resource_type AS LockedResource, 
            L.request_mode AS LockType,
            ST.text AS SqlStatementText,        
            ES.login_name AS LoginName,
            ES.host_name AS HostName,
            TST.is_user_transaction as IsUserTransaction,
            AT.name as TransactionName,
            CN.auth_scheme as AuthenticationMethod
    FROM    sys.dm_tran_locks L
            JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id
            JOIN sys.objects O ON O.object_id = P.object_id
            JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id
            JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id
            JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id
            JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id
            CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST
    WHERE   resource_database_id = db_id()
    ORDER BY L.request_session_id
    

    【讨论】:

      【解决方案3】:

      使用脚本:sp_blocker_pss08 或 SQL Trace/Profiler 和 Blocked Process Report 事件类。

      【讨论】:

      • 看起来很有趣。下次遇到这些问题我会试试这个
      猜你喜欢
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多