La siguiente consulta indicarle el porcentaje de @SpaceAllotted que utilizan los datos al observar cuántas páginas asignan los objetos de la base de datos.
No vale la pena intentar medir el uso en el nivel de fila, ya que SQL Server asigna todo el espacio en el nivel de extensión. Cada extensión está compuesta de ocho páginas de datos de 8KB. Entonces, si su base de datos solo tuviera una fila, y esa fila tuviera 4 bytes de datos, aún tendría que asignarse una extensión completa para mantener esos 4 bytes (o una extensión existente con páginas no asignadas que se usarían. Esto se denomina extensión mixta)
DECLARE @SpaceAllotted FLOAT
-- 2MB converted to kilobytes...
SET @SpaceAllotted = 2048
SELECT
-- Allocation is done on the extent-level.
-- Each extent contains eight 8KB data pages.
((1/(@SpaceAllotted)) * CEILING(CAST(SUM([ips].[page_count]) AS FLOAT)/8) * 64) * 100 AS PercentageUsed
FROM
[sys].[dm_db_index_physical_stats](DB_ID(), NULL, NULL, NULL, NULL) ips
-- This will allow us to retrieve the page count of all tables in the
-- current database, regardless of whether or not they have clustered
-- indexes and/or non-clustered indexes.
INNER JOIN
[sys].[indexes] i
ON
[ips].[object_id] = [i].[object_id]
AND [ips].[index_id] = [i].[index_id]
Dado que tenemos la posibilidad de extensiones mixtas, y ningún buena manera (hay maneras, pero no van a ser bastante) para determinar qué páginas se asignan a qué extensiones, esto no es 't 100% exacto. Además, las extensiones pueden incluso tener páginas libres (que están reservadas y, por lo tanto, aún ocupan espacio en disco), por lo que, en general, esta estimación siempre será baja. Sin embargo, es probablemente lo mejor que va a obtener sin escribir algo para inspeccionar la base de datos en el nivel de la página.
Ah sí, mirando las otras respuestas, esta es otra opción. Esto básicamente observará todo el tamaño actual de los archivos de datos en páginas y determinará el porcentaje del espacio que han consumido. Ahora, hay advertencias aquí también ...
- Si no hay un tamaño máximo especificado para la base de datos (crecimiento automático está activado y sin restricciones), esto no va a volar, ya que max_size será devuelto como -1.
- Nuevamente, no podemos determinar con precisión cuánto espacio utilizan los datos reales. Aquí estamos viendo cuánto espacio realmente se usa en el sistema de archivos.
- No estamos viendo el espacio de archivos de registro. Sí, eso aún consume espacio en el disco.
Espero que uno de estos resuelva su problema.
SELECT
((1/CAST(SUM([df].[max_size]) AS FLOAT)) * CAST(SUM([df].[size]) AS FLOAT)) * 100 AS PercentUsed
FROM
[sys].dm_io_virtual_file_stats(DB_ID(), NULL) vfs
INNER JOIN
[sys].[database_files] df
ON
[vfs].[file_id] = [df].[file_id]
WHERE
[df].[type] = 0
¿Qué es este "espacio" se utiliza? –
¿Cómo está particionando sus datos de usuario? ¿Está todo en la misma mesa? ¿O cada usuario tiene sus propias tablas? –
Tengo una tabla donde se guardan todos los datos del usuario. UserId se usa para diferenciar los datos de usuario individuales –