Ads Top

SP_WHO4

Muchas veces en la administración y/o optimización de bases de datos en MS SQLSERVER, usamos el siguiente script:

USE [master];
EXEC sp_who3

Pero dedibo a que hace muchas consultas para entregar el resultado en ocasiones donde la instancia está colapsada, este script de monitoreo recientemente lo adquirí para cuando tengo esas complicaciones y procedo a presentarselos


1. Consulta SP_WHO4

El script selecciona varias columnas de las vistas de administración dinámica (DMVs) para obtener información sobre las consultas en ejecución:

USE [master];
SELECT 
    r.[session_id],								-- ID de la sesión
    DB_NAME(r.[database_id]) AS DatabaseName,	-- Nombre de la base de datos    
    s.[login_name] AS LoginName,				-- Nombre del usuario que ejecuta la sesión
    s.[host_name] AS HostName,					-- Nombre del host desde el que se ejecuta
    s.[login_time] AS SessionStartTime,			-- Hora de inicio de la sesión
    r.[status],									-- Estado de la solicitud (RUNNING, SUSPENDED, etc.)
    SUBSTRING(qt.[text], r.[statement_start_offset] / 2,
        (CASE WHEN r.[statement_end_offset] = -1
              THEN LEN(CONVERT(NVARCHAR(MAX), qt.[text])) * 2
              ELSE r.[statement_end_offset]
        END - r.[statement_start_offset]
        ) / 2
    ) AS QueryText,								-- Parte de la consulta que está ejecutándose ahora
    convert(varchar(8), DATEADD(SECOND, (r.[cpu_time]/1000), 0), 108) AS CpuTime,	-- Tiempo de CPU utilizado (ms)
    convert(varchar(8), DATEADD(SECOND,(r.[total_elapsed_time]/1000), 0), 108) AS TotalElapsedTime,	-- Tiempo total de ejecución (ms)
    r.[last_wait_type] AS LastWaitType,			-- Último tipo de espera
    r.[wait_type] AS CurrentWaitType,			-- Tipo de espera actual
    r.[blocking_session_id] AS BlockingSessionID,	-- ID de la sesión que está bloqueando, si existe
    r.[reads] AS PhysicalReads,					-- Lecturas físicas realizadas
    r.[writes] AS PhysicalWrites,				-- Escrituras físicas realizadas
    r.[logical_reads] AS LogicalReads,			-- Lecturas lógicas realizadas (en caché)
    r.[scheduler_id],							-- ID del programador
    r.[plan_handle],							-- Identificador del plan de ejecución
    r.[sql_handle]								-- Identificador del lote/consulta
    

2. Unión de vistas de administración dinámica (DMVs)

El script utiliza las siguientes DMVs:


FROM sys.dm_exec_requests r
INNER JOIN sys.dm_exec_sessions s
    ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS qt
    
  • sys.dm_exec_requests: Proporciona información sobre las solicitudes (consultas) en ejecución.
  • sys.dm_exec_sessions: Proporciona información sobre las sesiones activas.
  • sys.dm_exec_sql_text: Devuelve el texto completo de la consulta asociada a un sql_handle.

3. Filtrado de resultados

El script filtra los resultados para excluir sesiones del sistema y consultas específicas:


WHERE r.session_id > 50									-- Excluir sesiones del sistema
AND SUBSTRING(qt.text, r.statement_start_offset / 2,
        (CASE WHEN r.statement_end_offset = -1
              THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
              ELSE r.statement_end_offset END - r.statement_start_offset) / 2
    ) NOT LIKE '%select r.session_id%'
AND SUBSTRING(qt.text, r.statement_start_offset / 2,
        (CASE WHEN r.statement_end_offset = -1
              THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
              ELSE r.statement_end_offset END - r.statement_start_offset) / 2
    ) NOT LIKE '%select * from OpenRowset(TrcData, @traceid, @records)%'
    

4. Ordenación de resultados

Los resultados se ordenan por tiempo total de ejecución y tiempo de CPU:


ORDER BY r.total_elapsed_time DESC, r.cpu_time DESC;
    

5. Ejemplo de salida

La salida del script podría verse así:

session_id DatabaseName LoginName HostName SessionStartTime status QueryText CpuTime TotalElapsedTime LastWaitType BlockingSessionID PhysicalReads LogicalReads
52 AdventureWorks user1 ELT-DB12 2023-10-01 10:00:00 RUNNING SELECT * FROM Orders 00:00:05 00:00:10 PAGEIOLATCH NULL 100 500
53 master user2 ELT-DB13 2023-10-01 10:01:00 SUSPENDED UPDATE Customers SET... 00:00:02 00:00:15 LCK_M_X 52 50 200

6. Conclusión

Este script es una herramienta poderosa para monitorear y diagnosticar problemas de rendimiento en SQL Server. Proporciona información detallada sobre las consultas en ejecución, lo que permite identificar cuellos de botella, bloqueos y consultas costosas.

No hay comentarios:

Con la tecnología de Blogger.