我正在对 SQL Server 2014 执行以下 dmv 查询,以查找服务器上的所有活动和任何阻塞活动:
SELECT Distinct
...
FROM sys.dm_exec_requests er
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st
LEFT JOIN sys.dm_exec_sessions ses ON ses.session_id = er.session_id
LEFT JOIN sys.dm_exec_connections con ON con.session_id = ses.session_id
WHERE st.text IS NOT NULL And DB_Name(er.database_id) IN ('Vincent', 'Vincent_Audit')
ORDER BY BlockingSessionId Desc, SessionId
该查询的示例结果如下:
可以看到会话 120 被 112 阻止,112 被 69 阻止。但是,进程 69 没有出现,因为它在 sys.dm_exec_requests 中不存在。
因此,以下查询不返回任何结果:
SELECT *
FROM sys.dm_exec_requests
Where session_id = 69
有谁知道为什么会这样?
会话可以在没有活动请求的情况下存在,但仍会阻止其他会话。
考虑一下您是否在 SSMS 中打开了一个窗口,您可以在其中运行它:
然后在另一个窗口中运行:
第一个会话将保持锁定状态
dbo.SomeTable
,而不会出现在sys.dm_exec_requests
. 您将在 中看到会话sys.dm_exec_sessions
,并且您将能够在 中看到打开的事务sys.dm_tran_session_transactions
。我推荐 Adam Machanic 的 sp_whoisactive,但是如果您不允许下载脚本以在您的服务器上运行,您可以考虑使用类似以下代码的代码,该代码可以在没有阻塞其他会话的活动请求的情况下识别打开的事务:
这实际上是非常有教育意义的。spid 69 没有出现在 sys.dm_exec_requests 中的原因是因为 sys.dm_exec_requests 只显示正在运行的进程,正如 Sean Gallardy 指出的那样。所以,我执行了 sp_who 并且 69 确实显示为一个暂停的进程。spid 69 正在执行插入操作,它正在等待释放资源。因此,它被暂停并且没有出现在 sys.dm_exec_requests 中。