En esta TN usaremos el conocido Procedure sp_WhoIsActive.sql de SQL, que encontraréis adjunto en este documento. (2007-2019 © Adam Machanic) . Al final, se trata de una potente herramienta para analizar el rendimiento y la actividad de SQL Server. Ideal para para administradores de sistemas o desarrolladores que necesiten diagnosticar problemas en el servidor, como lentitudes o consumos excesivos de las BBDD.
¿Qué hace sp_WhoIsActive?
Crear un Stored Procedure en la BBDD
Ejecutar el sp_WhoIsActive Procedure
Ejemplos de filtros y parámetros en el Procedure
Automatizar la ejecución y guardarlo en un archivo
Actualizar el Procedure sp_WhoIsActive
1. ¿Qué hace sp_WhoIsActive?
sp_WhoIsActive proporciona una vista detallada de las sesiones y procesos actualmente activos en la base de datos SQL Server. Incluye información útil como:
Sesiones Activas:
Muestra las sesiones actualmente conectadas y ejecutando consultas.
Se puede filtrar por sesión, base de datos, programa, usuario, etc.
Consultas y Bloqueos:
Identifica consultas que están en ejecución y su estado.
Muestra bloqueos y bloqueadores para detectar posibles problemas de concurrencia.
Uso de Recursos:
Información sobre uso de CPU, memoria, y tiempo de espera.
Estadísticas de IO y duración de las consultas.
Información de Bloqueo y Esperas:
Muestra detalles sobre las esperas (waits) que afectan a las consultas.
Ayuda a entender por qué las consultas están bloqueadas o lentas.
Plan de Ejecución y Parámetros:
Se puede ver el plan de ejecución de las consultas activas haciendo click encima de la sql_text.
2. Crear un Stored Procedures en la BBDD
Para implementar y utilizar un Stored Procedures sp_WhoIsActive en SQL Server desde SQL Server Management Studio (SSMS), sigue estos pasos:
- Abrir el Archivo en SSMS:
Abre el archivo sp_whoisactive.sql que viene adjunto en esta TN Puedes copiar su contenido o simplemente abrirlo directamente en una nueva ventana de consulta en SSMS (Ctrl+O).
- Ejecutar el Script:
Selecciona toda la consulta (Ctrl+A), elegir la BBDD donde queremos utilizarlo y luego ejecuta el script (F5). Esto creará un Stored Procedures en tu servidor.
- Verificar que se creó correctamente:
En la base de datos donde lo ejecutaste, navega usando el Explorador de Objetos:
Base de Datos > Programmability > Stored Procedures, y busca dbo.sp_WhoIsActive en la lista de Stored Procedures.
3. Usar sp_WhoIsActive
Para ejecutar el Procedure, es tan simple como crear una nueva Query;
EXEC sp_WhoIsActive;
Esto mostrará una lista de las sesiones activas en tu servidor con detalles como bloqueos, uso de recursos, el usuario, la query de ese momento, la maquina desde donde se lanza la consulta... de todas las BBDD que tenga el Servidor;
4. Ejemplos de filtros y parámetros en el Procedure
Se puede lanzar la query utilizando parámetros del Procedure para filtrar o ver más info detallada. Algunos ejemplos útiles:
- Filtrar por Base de Datos:
EXEC sp_WhoIsActive @filter_type = 'database', @filter = 'NombreDeTuBaseDeDatos';
- Incluir el SQL Completo:
EXEC sp_WhoIsActive @get_full_inner_text = 1;
- Mostrar Bloqueos :
EXEC sp_WhoIsActive @get_locks = 1;
- Información adicional de la memoria usada;
EXEC sp_WhoIsActive @get_memory_info= 1;
- Ver los parámetros y descripciones del Procedure;
EXEC sp_WhoIsActive @help = 1;
5. Automatizar la ejecución y guardarlo en una tabla
Si deseas, se puede automatizar la ejecución de este Procedure para obtener información periódica e incluso guardarlo en una tabla:
- Crear una tabla para almacenar los resultados Antes de ejecutar sp_WhoIsActive;
CREATE TABLE WhoIsActiveResults (
session_id INT,
login_time DATETIME,
status NVARCHAR(50),
query NVARCHAR(MAX),
cpu_time INT,
total_elapsed_time INT,
-- Agrega más columnas según sea necesario
capture_time DATETIME
);
- Crear un Procedure para insertar los resultados de sp_WhoIsActive en esta tabla;
CREATE PROCEDURE CaptureWhoIsActiveResults
AS
BEGIN
-- Insertar los resultados en la tabla temporal
INSERT INTO WhoIsActiveResults (session_id, login_time, status, query, cpu_time, total_elapsed_time, capture_time)
EXEC sp_WhoIsActive;
END
- Crea un Job en SQL Server Agent para que ejecute el Procedure periódicamente.
*La opción de crear Jobs. no está disponible para versiones SQL Server Express
En la pestaña Steps, seleccionar el Type T-SQL y añadir el en Command;
EXEC CaptureWhoIsActiveResults;
6. Actualizar el Procedure sp_WhoIsActive
Si el procedimiento almacenado es una versión antigua y/o estás usando una SQL muy moderna es posible no te funcione correctamente, siempre puedes comprobar en sus fuentes oficiales si estás en la ultima versión del Procedure y descargar en caso sea necesario en su repositorio;
- URL oficial: GitHub - sp_WhoIsActive
- Descarga la versión más reciente del script, elimina la versión existente en tu servidor y vuelve a crear el procedimiento almacenado ejecutándolo en SSMS.