Medir el uso de espacio y log de cada base

Una base se acerca al límite del volumen o el archivo de log crece con frecuencia. Necesitamos separar tamaño asignado, espacio utilizado y espacio todavía disponible dentro de los archivos actuales.

Qué necesitamos distinguir

Tamaño asignado es el espacio que ya pertenece al archivo; usado es la parte ocupada y disponible es la capacidad interna todavía libre. El log registra cambios para confirmar y recuperar transacciones.

El espacio libre dentro de un archivo no es lo mismo que el espacio libre del disco. La consulta mide la base actual: archivos de datos mediante páginas asignadas y el log como un conjunto, aunque existan varios archivos de log.

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
WITH EspacioDatos AS
(
    SELECT
        SUM(CONVERT(BIGINT, df.size)) * 8.0 / 1024 AS DatosAsignadosMb,
        SUM
        (
            CONVERT(BIGINT, FILEPROPERTY(df.name, 'SpaceUsed'))
        ) * 8.0 / 1024 AS DatosUtilizadosMb
    FROM sys.database_files AS df
    WHERE df.type_desc = N'ROWS'
),
EspacioLog AS
(
    SELECT
        lsu.total_log_size_in_bytes / 1048576.0 AS LogAsignadoMb,
        lsu.used_log_space_in_bytes / 1048576.0 AS LogUtilizadoMb,
        lsu.used_log_space_in_percent AS LogUtilizadoPorcentaje,
        lsu.log_space_in_bytes_since_last_backup / 1048576.0
            AS LogDesdeUltimoRespaldoMb
    FROM sys.dm_db_log_space_usage AS lsu
)
SELECT
    DB_NAME() AS BaseDatos,
    CONVERT(DECIMAL(18, 2), d.DatosAsignadosMb) AS DatosAsignadosMb,
    CONVERT(DECIMAL(18, 2), d.DatosUtilizadosMb) AS DatosUtilizadosMb,
    CONVERT
    (
        DECIMAL(18, 2),
        d.DatosAsignadosMb - d.DatosUtilizadosMb
    ) AS DatosDisponiblesDentroArchivoMb,
    CONVERT(DECIMAL(18, 2), l.LogAsignadoMb) AS LogAsignadoMb,
    CONVERT(DECIMAL(18, 2), l.LogUtilizadoMb) AS LogUtilizadoMb,
    CONVERT
    (
        DECIMAL(18, 2),
        l.LogAsignadoMb - l.LogUtilizadoMb
    ) AS LogDisponibleDentroArchivoMb,
    CONVERT(DECIMAL(6, 2), l.LogUtilizadoPorcentaje)
        AS LogUtilizadoPorcentaje,
    CONVERT(DECIMAL(18, 2), l.LogDesdeUltimoRespaldoMb)
        AS LogDesdeUltimoRespaldoMb
FROM EspacioDatos AS d
CROSS JOIN EspacioLog AS l;
GO

Parámetros o permisos

Ejecuta la consulta dentro de cada base que quieras medir. FILEPROPERTY consulta propiedades de archivos y solo reconoce los de la base actual. La vista de administración dinámica (DMV) del log expone su uso cambiante y requiere VIEW SERVER STATE hasta SQL Server 2019, o VIEW SERVER PERFORMANCE STATE desde SQL Server 2022. El resultado expresa MB y combina todos los archivos de datos por un lado y todos los archivos de log por otro. No consulta el espacio libre del sistema operativo ni los límites de crecimiento configurados.

Cómo leer el resultado

DatosDisponiblesDentroArchivoMb y LogDisponibleDentroArchivoMb indican cuánto puede ocuparse antes de que los archivos necesiten crecer. Un porcentaje alto del log merece relacionarse con el motivo que impide reutilizarlo, no reducir el archivo de inmediato. LogDesdeUltimoRespaldoMb tiene sentido dentro de la estrategia de recuperación y respaldos de log. Una cifra aislada no demuestra que falte un respaldo ni que el archivo esté dimensionado incorrectamente.

Qué conclusión sí permite obtener

Permite medir cuánto espacio está asignado y utilizado dentro de la base actual, y distinguir presión del archivo de datos de presión del log.

Qué conclusión todavía no permite obtener

No muestra espacio libre del disco, crecimiento histórico, autogrowth, límites máximos ni causa de retención del log. Tampoco indica que reducir archivos sea conveniente.

Siguiente comprobación razonable

Compara varias capturas para conocer la tendencia y revisa la configuración de archivos y del volumen. Si el log utilizado permanece alto, identifica por qué no puede reutilizarse.

Í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