Ver solicitudes activas y su consulta SQL

La aplicación responde con lentitud y necesitamos saber qué está ejecutando SQL Server en este momento. Una lista de sesiones conectadas no basta: una conexión puede existir sin tener una solicitud activa.

Qué necesitamos distinguir

Una sesión es la conexión lógica del cliente. Una solicitud es el trabajo que ejecuta en este momento, y una espera indica el recurso o condición que la mantiene detenida temporalmente.

Reuniremos la solicitud, la sesión que la envió y el texto SQL asociado. Separaremos el tiempo transcurrido, el consumo observado y la espera actual para no llamar “consulta lenta” a cualquier solicitud que aparezca en la lista.

Consulta

/*
    Antes de ejecutar:
        Revisa los permisos y los límites antes de ejecutar la consulta.
        Confirma el alcance, la base activa y el costo posible de la consulta.
        Captura evidencia en varios momentos antes de atribuir una causa.

    Este script es de observación. No aplica correcciones ni modifica datos.
*/

SET NOCOUNT ON;
GO
-- Consulta
SELECT
    r.session_id AS IdSesion,
    r.request_id AS IdSolicitud,
    DB_NAME(r.database_id) AS BaseDatos,
    s.login_name AS InicioSesion,
    s.host_name AS EquipoCliente,
    s.program_name AS Aplicacion,
    r.status AS EstadoSolicitud,
    r.command AS Comando,
    r.blocking_session_id AS IdSesionBloqueadora,
    r.wait_type AS TipoEspera,
    r.wait_time AS EsperaMilisegundos,
    r.cpu_time AS CpuMilisegundos,
    r.total_elapsed_time AS DuracionMilisegundos,
    r.logical_reads AS LecturasLogicas,
    r.reads AS LecturasFisicas,
    r.writes AS Escrituras,
    SUBSTRING
    (
        txt.text,
        (r.statement_start_offset / 2) + 1,
        ((CASE r.statement_end_offset
              WHEN -1 THEN DATALENGTH(txt.text)
              ELSE r.statement_end_offset
          END - r.statement_start_offset) / 2) + 1
    ) AS SentenciaActual,
    txt.text AS LoteCompleto
FROM sys.dm_exec_requests AS r
INNER JOIN sys.dm_exec_sessions AS s
    ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS txt
WHERE s.is_user_process = 1
  AND r.session_id <> @@SPID
ORDER BY
    r.total_elapsed_time DESC,
    r.session_id;
GO

Parámetros o permisos

La consulta excluye su propia sesión mediante @@SPID. En SQL Server 2019 y versiones anteriores, ver todas las solicitudes suele requerir VIEW SERVER STATE; en SQL Server 2022 o posterior se requiere VIEW SERVER PERFORMANCE STATE. Sin esos permisos, el resultado puede limitarse a la sesión actual. Los desplazamientos de la sentencia se expresan en bytes. Por eso se dividen entre dos al aplicarlos sobre texto Unicode.

Cómo leer el resultado

EstadoSolicitud indica si la solicitud está ejecutándose, preparada para obtener CPU o suspendida mientras espera. DuracionMilisegundos mide el tiempo desde que llegó la solicitud; no equivale a tiempo de CPU. Una duración alta junto con CPU baja puede apuntar a esperas, pero todavía hay que revisar TipoEspera y el contexto. SentenciaActual intenta aislar la instrucción dentro del lote. LoteCompleto ayuda a comprender variables y pasos anteriores. En solicitudes paralelas, algunos contadores de la fila coordinadora no reflejan por sí solos todo el trabajo de las tareas participantes.

Qué conclusión sí permite obtener

Permite identificar solicitudes de usuario activas en el instante de la captura, el texto asociado y varias señales iniciales de consumo o espera.

Qué conclusión todavía no permite obtener

No conserva historial ni demuestra que la solicitud sea la causa principal de una lentitud observada antes o después. Una captura aislada tampoco representa su comportamiento habitual.

Siguiente comprobación razonable

Si una solicitud está bloqueada, identifica las sesiones bloqueadoras y bloqueadas. Si aparece suspendida por otra espera, revisa las esperas de sus tareas activas. Para comparar ejecuciones a lo largo del tiempo se necesitan estadísticas acumuladas o Query Store.

Índice del recorrido

Diagnóstico y optimización

23 artículos de Diagnóstico y optimización
  1. 01Ver solicitudes activas y su consulta SQL
  2. 02Identificar sesiones bloqueadoras y bloqueadas
  3. 03Construir la cadena de bloqueo
  4. 04Encontrar transacciones abiertas por mucho tiempo
  5. 05Encontrar sesiones inactivas con transacción abierta
  6. 06Ver esperas de las solicitudes activas
  7. 07Revisar las principales esperas acumuladas
  8. 08Encontrar consultas con mayor consumo total de CPU
  9. 09Encontrar consultas con mayor lectura lógica
  10. 10Encontrar consultas con mayor duración promedio
  11. 11Recuperar el plan de ejecución almacenado
  12. 12Revisar sugerencias de índices faltantes
  13. 13Revisar uso de índices
  14. 14Revisar fragmentación de índices con alcance controlado
  15. 15Revisar antigüedad y modificación de estadísticas
  16. 16Medir el uso de espacio y log de cada base
  17. 17Diagnosticar por qué el log no puede reutilizarse
  18. 18Recuperar deadlocks recientes de system_health
  19. 19Encontrar consultas degradadas mediante Query Store
  20. 20Encontrar sesiones y solicitudes que consumen tempdb
  21. 21Revisar concesiones de memoria pendientes o excesivas
  22. 22Calcular latencia de lectura y escritura por archivo
  23. 23Encontrar consultas con varios planes y rendimientos diferentes