Loading repository data…
Loading repository data…
ieharo1 / repository
Toolkit de Administración de SQL Server es una colección completa de scripts profesionales para Database Administrators (DBAs), diseñada para facilitar el monitoreo, diagnóstico y mantenimiento de instancias SQL Server.
Toolkit de Administración de SQL Server es una colección completa de scripts profesionales para Database Administrators (DBAs), diseñada para facilitar el monitoreo, diagnóstico y mantenimiento de instancias SQL Server.
"Una buena administración previene problemas. Una excelente administración los anticipa."
Este toolkit proporciona herramientas prácticas para:
Estructura-de-datos-C/
├── monitoring/
│ ├── 01_sesiones_activas.sql # Monitoreo de sesiones y bloqueos
│ └── 02_deadlocks.sql # Detección y análisis de deadlocks
├── performance/
│ └── 01_queries_consumo.sql # Queries con mayor CPU e I/O
├── storage/
│ └── 01_tamano_almacenamiento.sql # Tamaño de BD, tablas e índices
├── maintenance/
│ └── 01_mantenimiento_indices.sql # Mantenimiento de índices y stats
└── README.md
| Script | Permiso Mínimo |
|---|---|
| Sesiones Activas | VIEW SERVER STATE |
| Deadlocks | VIEW SERVER STATE |
| Queries Consumo | VIEW SERVER STATE |
| Almacenamiento | VIEW DATABASE STATE |
| Mantenimiento | ALTER ANY INDEX |
-- Ejecutar: monitoring/01_sesiones_activas.sql
-- Sección 3: Sesiones Bloqueadas y Bloqueantes
SELECT
s.session_id AS SPID,
s.login_name AS Login,
r.blocking_session_id AS BloqueadoPor,
r.wait_type AS TipoEspera,
r.wait_time AS TiempoEspera_ms,
t.text AS Consulta
FROM sys.dm_exec_sessions s
INNER JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.blocking_session_id IS NOT NULL;
-- Ejecutar: performance/01_queries_consumo.sql
-- Sección 1: Top 20 Queries por Consumo Total de CPU
SELECT TOP 10
qs.execution_count AS Ejecuciones,
qs.total_worker_time / 1000 AS TotalCPU_ms,
qs.total_worker_time / qs.execution_count / 1000 AS PromedioCPU_ms,
SUBSTRING(qt.text, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1) AS QueryText
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_worker_time DESC;
-- Ejecutar: maintenance/01_mantenimiento_indices.sql
-- Sección 1: Verificar Fragmentación
SELECT
t.name AS Tabla,
i.name AS Indice,
ips.avg_fragmentation_in_percent AS Fragmentacion,
ips.page_count AS Paginas,
CASE
WHEN ips.avg_fragmentation_in_percent > 30 THEN 'REBUILD'
WHEN ips.avg_fragmentation_in_percent > 5 THEN 'REORGANIZE'
ELSE 'OK'
END AS AccionRecomendada
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips
INNER JOIN sys.tables t ON ips.object_id = t.object_id
INNER JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
WHERE ips.page_count > 100
ORDER BY ips.avg_fragmentation_in_percent DESC;
-- Ejecutar: monitoring/02_deadlocks.sql
-- Sección 2: Extraer Detalles de Deadlock
WITH DeadlockData AS (
SELECT CAST(xet.target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets xet
INNER JOIN sys.dm_xe_sessions xe ON xe.address = xet.event_session_address
WHERE xe.name = 'system_health'
AND xet.target_name = 'ring_buffer'
)
SELECT
Deadlock.value('(event/@timestamp)[1]', 'DATETIME') AS FechaDeadlock,
Deadlock.value('(event/data[@name="deadlock_graph"]/value//victim-list/victimProcess/@id)[1]', 'NVARCHAR(50)') AS VictimaID,
Deadlock.value('(event/data[@name="deadlock_graph"]/value//process-list/process[1]/@clientapp)[1]', 'NVARCHAR(128)') AS Aplicacion1,
Deadlock.value('(event/data[@name="deadlock_graph"]/value//process-list/process[2]/@clientapp)[1]', 'NVARCHAR(128)') AS Aplicacion2
FROM DeadlockData
CROSS APPLY TargetData.nodes('//event[@name="deadlock_graph"]') AS X(Deadlock)
ORDER BY FechaDeadlock DESC;
Procedimiento para mantenimiento automatizado de índices.
-- Ejecutar mantenimiento con parámetros personalizados
EXEC dbo.MantenimientoIndices
@FragmentacionMinima = 5.0,
@FragmentacionReorganizar = 30.0,
@FillFactor = 90;
Identifica estadísticas que necesitan actualización.
-- Ver estadísticas desactualizadas (más de 7 días)
EXEC dbo.ActualizarEstadisticasDesactualizadas
@DiasMinimos = 7,
@PorcentajeCambio = 20.0;
| DMV | Descripción |
|---|---|
| sys.dm_exec_sessions | Información de sesiones |
| sys.dm_exec_requests | Requests en ejecución |
| sys.dm_exec_query_stats | Estadísticas de queries |
| sys.dm_tran_locks | Locks activos |
| sys.dm_os_wait_stats | Estadísticas de esperas |
| DMV | Descripción |
|---|---|
| sys.dm_db_index_physical_stats | Fragmentación de índices |
| sys.dm_db_partition_stats | Estadísticas de particiones |
| sys.dm_db_index_usage_stats | Uso de índices |
| Evento | Descripción |
|---|---|
| system_health | Session predeterminada |
| deadlock_graph | Captura de deadlocks |
| sqlserver.sql_text | Texto de consultas |
sp_updatestatsDBCC FREEPROCCACHE sin entender el impactoWITH (NOLOCK) solo para consultas de monitoreoSELECT session_id, login_name, host_name, program_name, status
FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND status = 'running';
-- Reemplazar <SPID> con el session_id
KILL <SPID>;
EXEC master.sys.xp_fixeddrives;
EXEC sp_updatestats @resample = 'resample';
EXEC sp_spaceused;
-- 1. Identificar la cadena de bloqueo
-- Ejecutar: monitoring/01_sesiones_activas.sql (Sección 4)
-- 2. Identificar el query bloqueante
SELECT
s.session_id,
t.text AS QueryBloqueante
FROM sys.dm_exec_sessions s
INNER JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE s.session_id = (SELECT blocking_session_id FROM sys.dm_exec_requests WHERE blocking_session_id IS NOT NULL);
-- 3. Terminar sesión si es necesario
-- KILL <SPID>;
-- 1. Analizar deadlocks recientes
-- Ejecutar: monitoring/02_deadlocks.sql
-- 2. Identificar tablas involucradas
-- 3. Revisar índices en esas tablas
-- 4. Implementar retry logic en aplicaciones
-- 1. Identificar queries con mayor CPU
-- Ejecutar: performance/01_queries_consumo.sql
-- 2. Analizar execution plan
-- 3. Verificar estadísticas actualizadas
-- 4. Considerar creación de índices
Ingeniero en Sistemas · Full Stack · Automatización · Data
© 2026 Isaac Esteban Haro Torres - Todos los derechos reservados.