2009-04-21 23 views
12

Tengo un escenario donde a cada usuario se le han asignado 2 MB de espacio de base de datos. Ahora tengo que mostrar el uso de Percenatge de su espacio asignado, para hacerlo necesito saber el tamaño del registro individual en la Tabla.Tamaño de un solo registro? SQL

He intentado utilizar sp_spaceused e incluso he escrito un procedimiento personalizado haciendo uso de la longitud de datos ... pero muestran una gran diferencia en el resultado.

Hay alguna forma de solucionar esto.

+0

¿Qué es este "espacio" se utiliza? –

+2

¿Cómo está particionando sus datos de usuario? ¿Está todo en la misma mesa? ¿O cada usuario tiene sus propias tablas? –

+0

Tengo una tabla donde se guardan todos los datos del usuario. UserId se usa para diferenciar los datos de usuario individuales –

Respuesta

0

Los datos se guardan en el disco en los directorios nombrados para la base de datos. Eso incluye todo, incluso lo que no está midiendo (índices, etc.). Mida eso.

+0

Cómo medir esos consejos será útil –

10

Puede calcular el tamaño de una fila (de número de filas) con una fórmula bastante compleja. Consulte Books Online (ms-help: //MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/81fd5ec9-ce0f-4c2c-8ba0-6c483cea6c75.htm) para obtener los detalles exactos.

En resumen:

tomar el número de columnas y determinar el tamaño de cada columna por su tipo de datos para los tipos de datos de longitud fija.

Calcular el espacio utilizado para las columnas con valores nulos A continuación, calcular el rowspace:

Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4

+1

Excelente enlace en línea de libros, gracias. – DenNukem

24

Run DBCC SHOWCONTIG con su nombre de la tabla

dbcc showcontig ('TableName') with tableresults 

luego buscar en el mínimo máximo y tamaño de registro medio

+6

cuál es la unidad de esos tamaños que mencionas son KB o B – semirturgay

+0

https://msdn.microsoft.com/en-us/library/ms175008.aspx - Mirando esto creo que es Bytes – JsonStatham

+0

FYI, según el página MSDN enlazada: "Esta función se eliminará en una versión futura de Microsoft SQL Server. No use esta función en el nuevo trabajo de desarrollo y modifique las aplicaciones que actualmente utilizan esta función lo antes posible. En su lugar, use sys.dm_db_index_physical_stats". – DaveD

11

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 
+0

Desearía poder votar por usted más de una vez. :-) –

11

Desde SHOWCONTIG va a ser obsoleto, también se puede utilizar:

SELECT * FROM sys.dm_db_index_physical_stats 
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED') 
Cuestiones relacionadas