¿Hay alguna función incorporada / procedimiento almacenado / consulta que sea útil para recuperar información sobre el tamaño de MyTable
la base de datos de SQL Server?
¿Hay alguna función incorporada / procedimiento almacenado / consulta que sea útil para recuperar información sobre el tamaño de MyTable
la base de datos de SQL Server?
Respuestas:
Para una sola mesa puedes usar
sp_spaceused MyTable
Para todas las tablas de una base de datos, puede usarlo sp_msforeachtable
como 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
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).
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.
Hay muchos más datos como este disponibles en Detalles del Explorador de objetos.
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.
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.
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
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