Cómo determinar el tamaño de mis tablas en la base de datos de SQL Server

28

¿Hay alguna función incorporada / procedimiento almacenado / consulta que sea útil para recuperar información sobre el tamaño de MyTablela base de datos de SQL Server?

Heisenberg
fuente
Esta respuesta en SO tiene un script que es bastante simple y no requiere un procedimiento no documentado.
Shawn Melton
La respuesta dada por AA.SC es muy útil, excepto que el identificador de la base de datos msdb debe eliminarse de todos los DMV en la unión. Tal como está, solo informa sobre tablas en el propio msdb.
WaitForPete

Respuestas:

34

Para una sola mesa puedes usar

sp_spaceused MyTable

Para todas las tablas de una base de datos, puede usarlo sp_msforeachtablecomo sigue

CREATE TABLE #temp (
table_name sysname ,
row_count INT,
reserved_size VARCHAR(50),
data_size VARCHAR(50),
index_size VARCHAR(50),
unused_size VARCHAR(50))
SET NOCOUNT ON
INSERT #temp
EXEC sp_msforeachtable 'sp_spaceused ''?'''
SELECT a.table_name,
a.row_count,
COUNT(*) AS col_count,
a.data_size
FROM #temp a
INNER JOIN information_schema.columns b
ON a.table_name collate database_default
= b.table_name collate database_default
GROUP BY a.table_name, a.row_count, a.data_size
ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC
DROP TABLE #temp
aasim.abdullah
fuente
45

Si no desea escribir una secuencia de comandos, también puede abrir los 'Detalles del Explorador de Objetos' muy poco utilizados en SSMS (tecla de acceso directo F7).

Nivel superior de detalles del Explorador de objetos

Desde el nivel superior, abra la carpeta Tablas para obtener una lista de todas las tablas en su base de datos.

Es posible que deba personalizar las columnas para ver el espacio utilizado. Esto se puede hacer haciendo clic derecho en la fila del encabezado y eligiendo las columnas que desea mostrar.

Tamaño de datos de tabla en SSMS

Hay muchos más datos como este disponibles en Detalles del Explorador de objetos.

Mark Sinkinson
fuente
3
Mucho mejor que el enfoque t-sql anterior (que no funcionó para mí)
Orion Edwards
17

En SSMS, haga clic con el botón derecho en Base de datos, seleccione Informes, Informes estándar, Uso de disco por tablas superiores.

El informe le dará el número de filas y kilobytes utilizados por tabla.

Sir jura mucho
fuente
2

Eche un vistazo a sys.dm_db_partition_stats ( http://msdn.microsoft.com/en-us/library/ms187737.aspx ).

Hay algunas consultas de muestra en ese enlace y también en http://blogs.msdn.com/b/cindygross/archive/2010/04/02/dmv-series-sys-dm-db-partition-stats.aspx

Puede modificar para satisfacer sus necesidades, es decir, filtrar los índices no agrupados de entrada / salida. Multiplique el recuento de páginas por 8 para obtener el tamaño en KB, luego divida por 2 ^ 10 (= 1024) para convertir a MB si es necesario.

sp_spaceused ( http://msdn.microsoft.com/en-us/library/ms188776.aspx ) también proporcionará información sobre el tamaño de la tabla.

Andy Jones
fuente
2

Para obtener información sobre el tamaño de la tabla, me gusta usar el siguiente script

SELECT  sc.name + '.' + t.NAME AS TableName,  
        p.[Rows],  
        ( SUM(a.total_pages) * 8 ) / 1024 AS TotalReservedSpaceMB, -- Number of total pages * 8KB size of each page in SQL Server  
        ( SUM(a.used_pages) * 8 ) / 1024 AS UsedDataSpaceMB,  
        ( SUM(a.data_pages) * 8 ) / 1024 AS FreeUnusedSpaceMB  
FROM    msdb.sys.tables t  
        INNER JOIN msdb.sys.schemas sc ON sc.schema_id = t.schema_id  
        INNER JOIN msdb.sys.indexes i ON t.OBJECT_ID = i.object_id  
        INNER JOIN msdb.sys.partitions p ON i.object_id = p.OBJECT_ID  
                                            AND i.index_id = p.index_id  
        INNER JOIN msdb.sys.allocation_units a ON p.partition_id = a.container_id  
WHERE   t.type_desc = 'USER_TABLE'  
        AND i.index_id <= 1  --- Heap\ CLUSTERED
        AND t.NAME='MYTableName' -- Replace with valid table name
GROUP BY sc.name + '.' + t.NAME,  
        i.[object_id],i.index_id, i.name, p.[Rows]  
ORDER BY ( SUM(a.total_pages) * 8 ) / 1024 DESC  
AA.SC
fuente
1

Vaya a la base de datos, luego haga clic derecho y haga clic en informes, luego en informes estándar y luego en uso de disco por tabla. Esto le dará todos los archivos en esa base de datos y sus registros, datos, índices, etc.

SQLBen
fuente
0

puede usar el siguiente script que calcula el volumen para cada tabla y otro conjunto de resultados del total por base de datos

    SET NOCOUNT ON 
    IF OBJECT_ID('tempdb..#SpaceUsed') IS NOT NULL DROP TABLE #SpaceUsed

    CREATE TABLE #SpaceUsed 
    (
    TableName sysname ,
    [Rows] int ,
    [Reserved] varchar(20),
    [Data] varchar(20),
    [Index_Size] varchar(20),
    [Unused] varchar(20),
    [Reserved_KB] bigint,
    [Data_KB] bigint,
    [Index_Size_KB] bigint,
    [Unused_KB] bigint
    )

    DECLARE @CMD NVARCHAR(MAX) =''
    SELECT @CMD +='EXEC sp_spaceused ' +  ''''+QUOTENAME(TABLE_SCHEMA)+'.'+ QUOTENAME(TABLE_NAME)+''''+';'+CHAR(10)
    FROM INFORMATION_SCHEMA.TABLES 
    --PRINT @CMD

     INSERT INTO #SpaceUsed (TableName ,[Rows] , [Reserved], [Data] , [Index_Size] , [Unused] )
     EXEC sp_executesql @CMD



     UPDATE #SpaceUsed 
     SET [Reserved_KB] = CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Reserved] , ' KB', '')))),
         [Data_KB] = CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Data] , ' KB', '')))),
         [Index_Size_KB]= CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Index_Size] , ' KB', '')))),
         [Unused_KB]= CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Unused] , ' KB', ''))))


     SELECT TableName, [Rows], Reserved_KB , Data_KB , Index_Size_KB , Unused_KB ,  Data_KB / 1024.0 Data_MB , Data_KB / 1024.0 / 1024.0 Data_GB
     FROM #SpaceUsed
     ORDER BY Data_KB DESC 

     SELECT SUM(Reserved_KB) Reserved_KB , SUM(Data_KB) Data_KB, SUM(Index_Size_KB) Index_Size_KB , SUM(Unused_KB) Unused_KB ,SUM(Data_KB / 1024.0) Data_MB , SUM(Data_KB / 1024.0 / 1024.0) Data_GB
     FROM #SpaceUsed

     DROP TABLE #SpaceUsed
hkravitz
fuente