Estou executando a seguinte consulta dmv no SQL Server 2014 para encontrar todas as atividades em um servidor e quaisquer atividades de bloqueio:
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
Os resultados de exemplo desta consulta são os seguintes:
Você pode ver que a sessão 120 está bloqueada por 112 e 112 está bloqueada por 69. No entanto, o processo 69 não aparece porque não existe em sys.dm_exec_requests.
Portanto, a consulta a seguir não retorna resultados:
SELECT *
FROM sys.dm_exec_requests
Where session_id = 69
Alguém sabe por que isso seria?
As sessões podem existir sem uma solicitação ativa, mas ainda bloquear outras sessões.
Considere se você tem uma janela aberta no SSMS onde você executa isto:
Então em outra janela você executa:
A primeira sessão será travada em
dbo.SomeTable
, sem que apareça emsys.dm_exec_requests
. Você verá a sessão emsys.dm_exec_sessions
, e poderá ver a transação aberta emsys.dm_tran_session_transactions
.Eu recomendaria o sp_whoisactive de Adam Machanic, no entanto, se você não tiver permissão para baixar scripts para executar em seu servidor, considere algo como o seguinte código que pode identificar transações abertas sem uma solicitação ativa que esteja bloqueando outras sessões:
Isso realmente acabou sendo muito educativo. A razão pela qual o spid 69 não estava aparecendo em sys.dm_exec_requests era porque sys.dm_exec_requests mostra apenas processos em execução ativa como Sean Gallardy apontou. Então, executei sp_who e 69 apareceu como um processo suspenso. Uma operação de inserção estava sendo executada pelo spid 69 e estava aguardando a liberação de um recurso. Portanto, foi suspenso e não aparece em sys.dm_exec_requests.