sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server:diseccione las partes internas de sp_spaceused

Este artículo es un esfuerzo por diseccionar la salida de sp_spaceused procedimiento almacenado.

Introducción

Comprender el uso interno de la base de datos y las tendencias de crecimiento juegan un papel vital en la definición del tamaño correcto de la base de datos. sp_spaceused es probablemente el procedimiento almacenado del sistema más ejecutado por un administrador para encontrar el espacio en disco utilizado por una base de datos. Esto ayuda a obtener una visión rápida del uso de la base de datos. Estadísticas. sp_spaceused se utiliza para mostrar el número de filas, el tamaño de los datos, el tamaño del índice, la cantidad de espacio utilizado, el espacio no utilizado por cada objeto y el tamaño no asignado de la base de datos. Aunque observando los valores dados por sp_spaceused, uno no debería pensar en reducir la base de datos, el archivo de datos o el archivo de registro. Muchas veces, no somos conscientes de lo que estamos haciendo. Muchas veces, no sabemos cuáles serían los efectos secundarios de realizar tales operaciones intrínsecas de recursos. La salida de sp_spaceused nos dice mucho sobre el rendimiento actual de la base de datos. Los no asignados columna y la sin usar columna díganos el espacio libre que queda en la base de datos y los niveles de la tabla.

Este artículo considera:

  1. Un vistazo a sp_spaceused
  2. Impacto de la configuración de crecimiento automático en las columnas, sin asignar y sin usar
  3. Encontrar los detalles de uso del espacio en la base de datos y los niveles de instancia
  4. Medición de eventos de crecimiento automático
  5. Cómo encontrar los tamaños de archivo mdf y ldf
  6. Factores que determinan el rendimiento de la base de datos
  7. Y más...

Interiores de sp_spaceused

Capturar detalles de uso de espacio de todas las tablas

En el siguiente T-SQL, el procedimiento almacenado no documentado sp_MSforeachtable se usa para recorrer todas las tablas dentro del alcance del contexto de la base de datos actual para obtener las métricas de uso de espacio de todas las tablas en el contexto.

Declare @tbl_sp_spaceused table(
    name varchar(100) NULL,
    rows bigint NULL,
    reserved varchar(20) NULL,
    data varchar(20) NULL,
    index_size varchar(20) NULL,
    unused varchar(20) NULL
    )

-- insert output of sp_spaceused to table variable

INSERT INTO @tbl_sp_spaceused ( name, rows, reserved, data, index_size, unused )
EXEC sp_MSforeachtable @command1 = 'EXEC sp_spaceused [?]'

SELECT *
FROM @tbl_sp_spaceused
order by rows desc

Captura detalles de uso de espacio de todas las bases de datos

El procedimiento almacenado no documentado sp_MSforeachDB se usa para recorrer toda la base de datos dentro del alcance de la instancia de SQL actual para obtener la información de uso de espacio de todas las bases de datos.

declare @tbl_sp_spaceusedDBs table(
    database_name varchar(100) NOT NULL,
    database_size varchar(50) NULL,
    unallocated varchar(30) NULL,
    reserved varchar(20) NULL,
    data varchar(20) NULL,
    index_size varchar(20) NULL,
    unused varchar(20) NULL
    )
INSERT INTO @tbl_sp_spaceusedDBs ( database_name, database_size, unallocated, reserved, data, index_size, unused )
EXEC sp_msforeachdb @command1="use ? exec sp_spaceused @oneresultset = 1"

SELECT *
FROM @tbl_sp_spaceusedDBs
ORDER BY database_name, database_size

Aquí, nombre_de_la_base_de_datos es el nombre de la base de datos; en este caso, PythonSample . tamaño_de_la_base_de_datos es el Unasignado+Reservado+Datos+Índice+No utilizado =MDF +LDF (=848 MB en este caso). Los no asignados el espacio aquí es de 51,94 MB.

Este es, en realidad, el límite del disco que se ha marcado para la base de datos. sp_spaceused genera una columna no asignada definida en el nivel de la base de datos y no está reservada para ninguna tabla y puede ser tomada por el primer objeto que reclama más espacio para crecer.

Los no asignados el espacio es el espacio libre dentro del archivo de datos para que no tenga que crecer automáticamente cada vez que realiza una consulta; por lo general, el motor de almacenamiento de SQL Server administra el crecimiento automático mediante un mecanismo conocido como algoritmo de relleno proporcional. La administración de las extensiones se realiza de manera efectiva en función de la cantidad de escrituras que se realizan en los archivos. Y al mismo tiempo, cuando el espacio utilizado alcanza un umbral, se activa un evento para un mayor crecimiento automático. Establecer el valor correcto del espacio no asignado depende de las necesidades y las situaciones, y la naturaleza del uso de la base de datos. El espacio no asignado es el espacio que aún no está en uso y está "disponible". En esencia, estas extensiones están marcadas con el bit 1 en la página GAM. Entendiendo el concepto de crecimiento automático desde arriba, cualquier tipo de crecimiento puede generar más extensiones no asignadas.

Usando la siguiente consulta SQL, podemos ver la cantidad de veces que se generó el evento de crecimiento automático, junto con la cantidad de tiempo que la base de datos se mantuvo en espera durante el proceso.

DECLARE @fname NVARCHAR(1000);

-- Get the name of the current default trace
SELECT @fname = CAST(value AS VARCHAR(MAX))
FROM ::fn_trace_getinfo(DEFAULT)
WHERE traceid = 1 AND property = 2;


SELECT 
	 ft.StartTime [Start Time]
	,t.name [Event Name]
	,DB_NAME(ft.databaseid) [Database Name]
	,ft.Filename [File Name]
	,(ft.IntegerData*8)/1024.0 [Growth MB]
	,(ft.duration/1000) [Duration MS]
FROM ::fn_trace_gettable(@fname, DEFAULT) AS ft 
INNER JOIN sys.trace_events AS t ON ft.EventClass = t.trace_event_id  
WHERE (ft.EventClass = 92  -- DateFile Auto-growth
    OR ft.EventClass = 93) -- LogFile Auto-growth
ORDER BY ft.StartTime

Veamos qué significa cada uno de los términos:

Reservado :El espacio reservado para el uso de los objetos de la base de datos =(Datos +Índice + Sin usar ) =476704 + 1280 + 1312 =479296 KB. Esto indica qué tan llenos están los objetos; idealmente, se espera un 10 % del espacio no utilizado para tablas transaccionales.

Datos :El tamaño real de los datos. Esta es la suma de todos los archivos de datos de la base de datos.

Índice :la cantidad de espacio utilizado por el índice.

Nota:En algunos casos, he visto que el tamaño del índice es mayor que el tamaño de los datos reales. En lo que respecta a los índices, lo que se necesita para el sistema siempre depende del rendimiento de la base de datos. Muchas veces, las operaciones de lectura son más importantes que las operaciones de escritura. Y en algunos otros casos, las escrituras son más importantes que las lecturas. En los casos en que la empresa haya decidido que las lecturas son mucho más importantes que las escrituras, es posible que ese sistema necesite toneladas de índices para satisfacer los requisitos de rendimiento de la empresa y los usuarios.

Sin usar :Una parte del espacio reservado, que aún no se utiliza

Las páginas no utilizadas son páginas en extensiones asignadas pero que aún no han sido utilizadas por ningún objeto. Tan pronto como se asigna una extensión (ya sea como una extensión uniforme o compartida), obtenemos ocho páginas reservadas en esa extensión. Algunas páginas se usan y otras no se usan.

El sin usar y sin asignar las columnas en la salida pueden ser confusas. Para aclarar, el sin usar la salida de la columna no muestra la cantidad de espacio libre que queda en toda la base de datos. Es, en cambio, la cantidad total de espacio reservado para tablas pero no lleno de datos. En muchos casos, el espacio no utilizado puede recuperarse creando un índice agrupado o administrando los índices existentes.

La salida de sp_spaceused se puede simplificar aún más para encontrar el tamaño del archivo .mdf y los archivos .log. La suma del espacio reservado y el espacio no asignado es más o menos igual al tamaño del archivo de datos o MDF. Además, al restar el tamaño del archivo MDF del tamaño de la base de datos se obtiene el tamaño del archivo de registro.

Así que aquí hay dos fórmulas:

Tamaño del archivo MDF =reservado + espacio no asignado

Tamaño del archivo de registro =Database_Size – Tamaño del archivo MDF

SELECT 476704+ 1280+ 1312 'Reserved KB', (479296/1024.00)+51.94 'MDFSizeMB', 848.00 - ((479296/1024.00)+51.94) 'LogSizeMB'

Los puntos antes mencionados nos dicen cómo se interpreta, calcula y analiza cada una de las columnas en la salida de sp_spaceused.

Impacto de la configuración de crecimiento automático

Los tamaños iniciales y la configuración de crecimiento automático tienen un efecto significativo en el espacio no utilizado. Establecer los valores correctos para estos es un desafío. He visto muchos casos en los que el crecimiento automático se estableció para crecer en términos de porcentajes. Supongamos que el crecimiento automático se establece en un 25 % para un tamaño de archivo de datos de 100 GB. Solo se necesitan 4 eventos de crecimiento automático para llenar la unidad de disco.

El otro caso es reconstruir los índices. Esta operación tiene un impacto directo en el espacio no utilizado de la tabla, ya que los datos se reorganizan entre las extensiones uniforme y mixta. En algunos casos, mientras se reorganizan las páginas, la operación puede inducir espacio no asignado debido a la configuración de crecimiento automático del archivo de datos.

Consideremos un escenario en el que la configuración de crecimiento automático no está configurada correctamente en la base de datos. Esto vuelve a ser un problema:si el crecimiento automático está habilitado en la base de datos, significa que la expansión de la unidad se lleva a cabo automáticamente durante algún evento, incluso si los datos no usan todo el espacio.

Siempre es una buena práctica establecer la configuración de crecimiento automático adecuada para el archivo de datos. A veces, la configuración incorrecta del archivo de datos puede inyectar fragmentación física, lo que provoca una grave degradación del rendimiento del sistema. En otras palabras, si no tiene espacio sin asignar, los nuevos datos intentarán ubicarse en lugares vacíos que pueden estar dispersos. Esto también se aplica al archivo de registro. El espacio no asignado en la base de datos influye indirectamente en la configuración de crecimiento automático del archivo de datos y el archivo de registro e influye directamente en el rendimiento. La clave es encontrar el equilibrio adecuado.

Conclusión

  1. En el proceso de creación de la base de datos, el tamaño definido (es decir, el tamaño inicial) no es más que el tamaño real de la base de datos. Este tamaño inicial se registra en el encabezado de la página. Durante un proceso de reducción de base de datos, el proceso utiliza el tamaño mínimo propiedad como referencia, solo si el tamaño real de los datos es menor que el tamaño mínimo; el tamaño mínimo también se encuentra en el encabezado de la página y se puede ver mediante el comando DBCC PAGE. Además, el mismo proceso es válido para DBCC SHRINKFILE, que reduce los archivos a un tamaño inferior al inicial.
  2. No es una práctica recomendada reducir la base de datos para liberar espacio en el disco, aunque la decisión depende del escenario; los escenarios inusuales pueden justificar una acción no convencional. Sin embargo, se debe recordar que reducir una base de datos introduce fragmentación en la base de datos. Siempre es una buena práctica analizar la causa raíz del espacio no asignado y espacio no utilizado de los objetos En muchos casos, expandir el disco para manejar el crecimiento de datos sería una opción viable/recomendada.
  3. Configuración de crecimiento automático:cuando SQL Server realiza una operación de crecimiento automático, la transacción que activó el evento de crecimiento automático tendrá que esperar hasta que se complete el evento de crecimiento automático. Solo entonces se puede completar la transacción.
  4. Siempre se recomienda establecer las opciones de crecimiento automático en números en lugar de porcentajes.
  5. La inducción de espacio no utilizado en la tabla podría deberse a las siguientes razones:
    • Fragmentación
      Cuando los datos se fragmentan debido a su naturaleza y tipo de definición, se genera algo de espacio sin usar. Además, una modificación frecuente de los datos (todas las operaciones ACTUALIZAR, INSERTAR O ELIMINAR) conduce a una mayor cantidad de divisiones de página, lo que es más probable que genere espacio no utilizado en la tabla.
    • No hay índice agrupado en la tabla
      Para reducir la fragmentación en un Heap, se puede pensar en crear un índice agrupado en la mesa. Para reducir la fragmentación del índice, realice el mantenimiento del índice determinando el valor avg_fragmentation_in_percent.
    • Tamaño de los datos
      En algunos casos, el uso de tipos de datos adecuados produce filas de datos más pequeñas que, a su vez, permiten colocar más filas en una página. No solo reduce el espacio interno no utilizado, sino que también tiene un impacto en el rendimiento al reducir la cantidad de divisiones de página.
  6. El espacio sin usar también puede ser el resultado de eliminar la columna de longitud variable. Use DBCC CLEANTABLE después de realizar cambios significativos en las columnas de longitud variable en una tabla o vista indizada para recuperar inmediatamente el espacio no utilizado. Alternativamente, puede reconstruir los índices en la tabla o vista; sin embargo, esta es una operación que requiere más recursos.
  7. El espacio no utilizado es relativamente más grande cuando terminamos cargando datos relativamente más grandes (>8 KB). En tales casos, terminamos con grandes cantidades de espacio sin usar en las páginas de datos.
  8. Después de una migración de SharePoint, se puede ver una cantidad significativa del espacio no utilizado introducido en las bases de datos. La recuperación es un proceso más lento, el proceso de limpieza fantasma elimina estas páginas y la liberación ocurre durante un período de tiempo.
  9. En algunos casos, los valores de sp_spaceused pueden no ser correctos. Aunque sp_spaceused obtiene su información del objeto del sistema que contiene todas las estimaciones, a veces puede ser inexacta. Una de las razones de esto es que durante una migración de la base de datos, o en el caso de estadísticas desactualizadas, o cuando el sistema está experimentando modificaciones DDL frecuentes, o después de realizar grandes operaciones de copia masiva. Para sincronizar los objetos del sistema, use las instrucciones DBCC updateusage(0) o DBCC CHECKTABLE para garantizar que sp_spaceused devuelva datos precisos actualizados. Sin embargo, recuerde que los comandos DBCC consumen muchos recursos; tener una buena comprensión de las implicaciones de su uso. Cuando ejecutamos el comando DBCC updateusage, el motor de base de datos de SQL Server escanea las páginas de datos en la base de datos y hace las correcciones necesarias en sys.allocation_units y sys.particiones vistas de catálogo con respecto al espacio de almacenamiento utilizado por cada mesa.

Referencias

  • https://msdn.microsoft.com/en-us/library/cc280360.aspx
  • https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql
  • https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-database-files-transact-sql