2010-10-13 10 views
56

¿Cómo se puede saber qué tablas ocupan más espacio en una base de datos de SQL Server 2005?¿Cómo se puede saber qué tablas ocupan más espacio en una base de datos de SQL Server 2005?

Estoy seguro de que hay algún procedimiento almacenado en el sistema que muestra esta información.

Tengo una base de datos de PRUEBA que creció de 1 TB a 23 TB. Actualmente estamos realizando muchas pruebas de conversión de clientes en la base de datos, lo que implica ejecutar el mismo procedimiento almacenado de conversión varias veces. Hace DELETE que estoy seguro está aumentando el Registro de transacciones. Pero esto me hizo pensar en hacer esta pregunta.

Gracias de antemano.

+1

Marc_S y respuestas de Barry, donde simplemente excepcional por lo que upvoted ambos y estaba esperando para ver cuál tiene el mayor número de upvotes por lo que podría recompensar lo que tiene la "Respuesta Aceptada". Pero ambos estaban empatados a 5, así que elegí uno pero utilicé ambos. ¡Muchas gracias Marc_S y Barry! –

Respuesta

145

Prueba este guión - que indique el número de filas y el espacio utilizado por las filas de datos (y el espacio total utilizado) para todas las tablas de la base de datos:

SELECT 
t.NAME AS TableName, 
i.name AS indexName, 
SUM(p.rows) AS RowCounts, 
SUM(a.total_pages) AS TotalPages, 
SUM(a.used_pages) AS UsedPages, 
SUM(a.data_pages) AS DataPages, 
(SUM(a.total_pages) * 8)/1024 AS TotalSpaceMB, 
(SUM(a.used_pages) * 8)/1024 AS UsedSpaceMB, 
(SUM(a.data_pages) * 8)/1024 AS DataSpaceMB 
FROM 
sys.tables t 
INNER JOIN 
sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
INNER JOIN 
sys.allocation_units a ON p.partition_id = a.container_id 
WHERE 
t.NAME NOT LIKE 'dt%' AND 
i.OBJECT_ID > 255 AND 
i.index_id <= 1 
GROUP BY 
t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
OBJECT_NAME(i.object_id) 
+5

+1 Brillante. Tenga en cuenta que esto no incluye el tamaño de los índices de datos. Para mí, sin embargo, hizo el trabajo. –

+18

No lo sabía, pero si está utilizando Management Studio también puede hacer clic con el botón derecho en la base de datos y acceder a Informes -> Uso de disco por tabla para obtener los mismos resultados. – rossisdead

+0

@rossisdead, esa es información hilarante para saber. ¡Gracias! – Nickmaovich

30

Uso sp_spacedUsed

Exec sp_spaceused N'YourTableName'

O si lo desea ejecutar la sp_spaceused para cada tabla en su base de datos, puede utilizar este SQL:

set nocount on 
create table #spaceused (
    name nvarchar(120), 
    rows char(11), 
    reserved varchar(18), 
    data varchar(18), 
    index_size varchar(18), 
    unused varchar(18) 
) 

declare Tables cursor for 
    select name 
    from sysobjects where type='U' 
    order by name asc 

OPEN Tables 
DECLARE @table varchar(128) 

FETCH NEXT FROM Tables INTO @table 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    insert into #spaceused exec sp_spaceused @table 
    FETCH NEXT FROM Tables INTO @table 
END 

CLOSE Tables 
DEALLOCATE Tables 

select * from #spaceused 
drop table #spaceused 

exec sp_spaceused 

El SQL anterior es de comentario here

+6

Para las versiones más nuevas de SQL Server también puede usar 'exec sp_msforeachtable 'exec sp_spaceused N' '?' ''' – JNK

+0

@JNK - Buen punto – codingbadger

+1

@JNK 'sp_msforeachtable' existe al menos SQl Server 2000 – SQLMenace

1

de Rossisdead respondió a esta pregunta lo mejor para mí, me gustaría que no fue enterrado en un comentario. Esto será útil para gente como yo no tratar de escritura de la solución (el PO no hizo piden un fragmento de código)

Si está utilizando Management Studio también puede hacer clic derecho en la base de datos y ir a Informes -> Uso del disco en el cuadro de las mismas resultados

Cuestiones relacionadas