2010-10-13 9 views
56

Come si può sapere quali tabelle occupano più spazio in un database di SQL Server 2005?Come si può sapere quali tabelle occupano più spazio in un database di SQL Server 2005?

Sono sicuro che esiste una procedura memorizzata del sistema che mostra queste informazioni.

Ho un database TEST che è cresciuto da 1 TB a 23 TB. Al momento stiamo eseguendo numerosi test di conversione dei client nel database, il che comporta l'esecuzione della stessa Stored Procedure di conversione più volte. Fa DELETEs che sono sicuro sta aumentando il registro delle transazioni. Ma questo mi ha fatto pensare a fare questa domanda.

Grazie in anticipo.

+1

Marc_S e risposte di Barry, dove semplicemente eccezionale così ho upvoted ciascuno di essi e aspettava di vedere quale ha ottenuto il maggior numero di upvotes così ho potuto premiare quello con la "risposta accettata". Ma erano entrambi legati alle 5 quindi ne ho preso uno ma li ho usati entrambi. Grazie mille Marc_S e Barry! –

risposta

145

Prova questo script - sarà elencare il numero di righe e lo spazio utilizzato da righe di dati (e lo spazio totale utilizzato) per tutte le tabelle nel database:

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. Si noti che questo non include la dimensione degli indici di dati. Per me, però, ha fatto il lavoro. –

+18

Non lo sapevo, ma se usi Management Studio puoi anche fare clic con il tasto destro del mouse sul database e andare su Rapporti -> Utilizzo disco per tabella per gli stessi risultati. – rossisdead

+0

@rossisdead, è una spassosa informazione da sapere. Grazie! – Nickmaovich

30

Usa sp_spacedUsed

Exec sp_spaceused N'YourTableName'

Oppure, se si desidera eseguire il sp_spaceused per ogni tabella nel database, allora è possibile utilizzare questo 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 

È possibile che SQL è da commentare here

+6

Per le versioni più recenti di SQL Server è anche possibile utilizzare 'exec sp_msforeachtable' exec sp_spaceused N '' '' '' – JNK

+0

@JNK - Il punto buono – codingbadger

+1

@JNK' sp_msforeachtable' esiste almeno da SQl Server 2000 – SQLMenace

1

di Rossisdead risposto a questa domanda il meglio per me, vorrei che non è stato sepolto in un commento. Questo sarà utile per chi come me non cercando di script di soluzione (il PO ha fatto non chiedere un frammento di codice)

Se si sta utilizzando Management Studio è anche possibile fare clic destro sul database e andare Rapporti -> Disk Usage dalla tabella per gli stessi risultati

Problemi correlati