2010-10-13 14 views
56

Jak rozpoznać, które tabele zajmują najwięcej miejsca w bazie danych SQL Server 2005?Jak rozpoznać, które tabele zajmują najwięcej miejsca w bazie danych SQL Server 2005?

Jestem pewien, że istnieje procedura składowania systemu, która pokazuje te informacje.

Mam bazę danych TEST, która wzrosła z 1 tb do 23 tb. Obecnie przeprowadzamy wiele testów konwersji klienta w bazie danych, co oznacza wielokrotne przeprowadzanie tej samej procedury składowania konwersji. Robi DELETE, które na pewno zwiększają dziennik transakcji. Ale skłoniło mnie to do zadania tego pytania.

Z góry dziękuję.

+1

Marc_S i odpowiedzi Barry'ego gdzie po prostu znakomity więc upvoted oboje i czekał, aby zobaczyć, który z nich ma najwięcej upvotes więc mogłem nagrodzić, że jeden z "Zaakceptowana odpowiedź". Ale obaj byli związani na 5, więc wybrałem jeden, ale użyłem obu. Dziękuję bardzo Marc_S i Barry! –

Odpowiedz

145

Spróbuj tego skryptu - będzie notować liczbę wierszy i przestrzeni używanej przez wierszy danych (i całkowite miejsce wykorzystane) dla wszystkich tabel w bazie danych:

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 Brilliant. Należy zauważyć, że nie uwzględnia to wielkości indeksów danych. Dla mnie jednak to się stało. –

+18

Nie wiedziałem o tym, ale jeśli korzystasz z Management Studio, możesz również kliknąć prawym przyciskiem myszy na bazę danych i przejść do raportów -> Użycie dysku przez tabelę dla tych samych wyników. – rossisdead

+0

@rossisdead, to zabawna informacja. Dzięki! – Nickmaovich

30

Korzystając sp_spacedUsed

Exec sp_spaceused N'YourTableName'

Albo jeśli chcesz wykonać sp_spaceused dla każdej tabeli w bazie danych można użyć tego 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 

Powyższy SQL jest od Komentarz here

+6

Dla nowszych wersji SQL Server możesz również użyć 'exec sp_msforeachtable 'exec sp_spaceused N' '?' ''' – JNK

+0

@JNK - Dobry punkt – codingbadger

+1

@JNK 'sp_msforeachtable' istnieje od co najmniej SQl Server 2000 – SQLMenace

1

Rossisdead odpowiadali na to pytanie najlepiej dla mnie, żeby to nie był pochowany w komentarzu. Będzie to przydatne dla ludzi takich jak ja nie próbuje skryptu rozwiązanie (PO zrobił nie poprosić o fragmencie kodu)

Jeśli używasz Management Studio można również kliknąć prawym przyciskiem myszy na bazie i przejdź do Raportów -> Disk Usage Tablica dla tych samych wyników

Powiązane problemy