Nuevamente les dejo un resumen-traducción de una publicación de MSSQLTips escrita por Basit Farooq.
Ver los procesos bloqueados:
- USE [master]
- GO
- SELECT session_id
- ,blocking_session_id
- ,wait_time
- ,wait_type
- ,last_wait_type
- ,wait_resource
- ,transaction_isolation_level
- ,lock_timeout
- FROM sys.dm_exec_requests
- WHERE blocking_session_id <> 0
- GO
GRANT-WAIT-CONVERT
):
- USE [master]
- GO
- SELECT * from sys.dm_tran_locks
- WHERE request_status = 'CONVERT'
- GO
request_session_id
contiene el ID del proceso. Para ver el bloqueo en una base de datos particular, ejecutar la siguiente consulta, que une sys.dm_tran_locks
con sys.partitions
:
- USE [master]
- GO
- SELECT tl.resource_type
- ,tl.resource_associated_entity_id
- ,OBJECT_NAME(p.object_id) AS object_name
- ,tl.request_status
- ,tl.request_mode
- ,tl.request_session_id
- ,tl.resource_description
- FROM sys.dm_tran_locks tl
- LEFT JOIN sys.partitions p
- ON p.hobt_id = tl.resource_associated_entity_id
- WHERE tl.resource_database_id = DB_ID()
- GO
sys.dm_os_waiting_tasks
nos brinda información sobre bloqueos y procesos bloqueados. Los procesos bloqueados están listados en la columna
session_id y los bloqueos en blocking_session_id
.
- USE [master]
- GO
- SELECT w.session_id
- ,w.wait_duration_ms
- ,w.wait_type
- ,w.blocking_session_id
- ,w.resource_description
- ,s.program_name
- ,t.text
- ,t.dbid
- ,s.cpu_time
- ,s.memory_usage
- FROM sys.dm_os_waiting_tasks w
- INNER JOIN sys.dm_exec_sessions s
- ON w.session_id = s.session_id
- INNER JOIN sys.dm_exec_requests r
- ON s.session_id = r.session_id
- OUTER APPLY sys.dm_exec_sql_text (r.sql_handle) t
- WHERE s.is_user_process = 1
- GO
sp_who/sp_who2
nos brindan información sobre todas las sesiones establecidas con la BD y sus respectivos ID (ipid
). Ambos procedimientos aceptan parámetros. La columna blk
de sp_who y la columna blkby
de sp_who2 contienen el spid de procesos bloqueados.
- USE master
- GO
- EXEC sp_who 'active';
- -- EXEC sp_who2 'active';
- GO
KILL
. Se puede utilizar la instrucción KILL para ver el estado de un proceso o matarlo:
- USE master
- GO
- KILL spid | UOW [WITH STATUSONLY]
- GO