2010-10-13 17 views
56

Tabloların SQL Server 2005 veritabanında en fazla yer kapladığını nasıl anlayabilirsiniz?Tabloların SQL Server 2005 veritabanında en çok yer kapladığını nasıl anlayabilirsiniz?

Eminim bu bilgileri gösteren bazı Sistem Saklı Yordamları vardır.

1tb ila 23tb arasında büyüyen bir TEST veritabanım var. Şu anda veritabanında çok sayıda istemci dönüştürme testi yapıyoruz. Bu, aynı dönüşüm Stored Procedure'u birden çok kez çalıştırmayı gerektiriyor. İşlem Günlüğünü artıracağından emin olduğum DELETE'leri yapar. Ama bu bana bu soruyu sormayı düşündü.

Şimdiden teşekkürler.

+1

Marc_s ve Barry'nin cevaplar için Tablo tarafından Disk Kullanımı "Kabul Edilen Cevap". Ama ikisi de 5'e bağlıydı, ben de bir tane aldım ama ikisini de kullandım. Çok teşekkür ederim Marc_S ve Barry! –

cevap

145

Bu komut dosyasını deneyin - veritabanındaki tüm tablolar için satır sayısını ve veri satırlar tarafından kullanılan alanı (ve kullanılan toplam alanı) listeler:

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 Parlak. Bunun, veri dizinlerinin boyutunu içermediğini unutmayın. Benim için olsa da, işi bitirdi. –

+18

Bunu bilmiyordum, ancak Management Studio'yu kullanıyorsanız, veritabanına sağ tıklayıp aynı sonuçlar için Raporlar -> Disk Kullanımı Tablo'ya da gidebilirsiniz. – rossisdead

+0

@rossisdead, bilmeniz gereken komik bir bilgi parçası. Teşekkürler! – Nickmaovich

30

kullanın sp_spacedUsed

Exec sp_spaceused N'YourTableName'

Ya da veritabanındaki her tablo için sp_spaceused yürütmek istiyorsanız o zaman bu SQL kullanabilirsiniz:

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 

yukarıdaki SQL here

+6

SQL Server'ın daha yeni sürümleri için ayrıca 'exec sp_msforeachtable' exec sp_spaceused N ''? '' '' – JNK

+0

@JNK - İyi nokta – codingbadger

+1

@JNK' sp_msforeachtable' en az SQl Server 2000 – SQLMenace

1

Rossisdead 'in yorumları bu soruyu benim için en iyi cevap itibaren, ben bir yorumda gömülmemiş dilek olduğunu. Bu benim gibi insanlar senaryoya çözüm çalışmıyorum için faydalı olacaktır Management Studio kullanıyorsanız

(OP değil bir kod parçacığı için sormak mi) yapabilirsiniz veritabanı üzerinde sağ tıklayıp ve Raporlar gidin -> bu yüzden her ikisi upvoted ve bu yüzden o bir ödül verebilecek en upvotes var hangisinin görmeyi bekliyordu sadece olağanüstü aynı sonuçları