Tablolarımı SQL Server veritabanındaki boyutunu belirleme


28

MyTableSQL Server veritabanındaki büyüklüğü hakkında bilgi almak için yararlı olan herhangi bir yerleşik işlev / saklı yordam / sorgu var mı?


SO'daki bu cevap oldukça basit ve belgelenmemiş bir prosedür gerektirmeyen bir komut dosyasına sahiptir.
Shawn Melton

AA.SC tarafından verilen cevap, msdb veritabanı tanımlayıcısının birleştirme içindeki tüm DMV'lerden kaldırılması gerekmesi dışında çok kullanışlıdır. Durduğu gibi sadece msdb'deki tablolarda rapor veriyor!
WaitForPete

Yanıtlar:


34

Tek masa için kullanabilirsiniz

sp_spaceused MyTable

Veritabanındaki tüm tablolar için sp_msforeachtablefollwoing olarak kullanabilirsiniz

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

45

Bir komut dosyası yazmak istemiyorsanız, SSMS'de çok kullanılan “Nesne Gezgini Ayrıntıları” nı da açabilirsiniz (Kısayol tuşu F7).

Object Explorer Ayrıntılarının Üst Seviyesi

Veritabanınızdaki tüm tabloların bir listesini almak için Üst Düzey'den Tablolar klasörünü açın.

Kullanılan Boşluğu görmek için sütunları özelleştirmeniz gerekebilir. Bu, başlık satırına sağ tıklayarak ve görüntülemek istediğiniz sütunları seçerek yapılabilir.

SSMS'deki tablo veri boyutu

Object Explorer Details'de buna benzer daha birçok veri var.


3
Yukarıdaki t-sql yaklaşımından çok daha güzel (ki benim için işe yaramadı)
Orion Edwards

17

SSMS'de Veritabanına sağ tıklayın, Üst Tablolara Göre Raporlar, Standart Raporlar, Disk Kullanımı'nı seçin.

Raporda, tablo başına kullanılan satır ve kilobayt sayısı verilecek.


2

Sys.dm_db_partition_stats ( http://msdn.microsoft.com/en-us/library/ms187737.aspx ) 'e bakınız.

Bu bağlantıda ve ayrıca http://blogs.msdn.com/b/cindygross/archive/2010/04/02/dmv-series-sys-dm-db-partition-stats.aspx adresinde bazı örnek sorular var

İhtiyaçlarınıza göre (ör. Kümelenmemiş dizinleri süzme / filtreleme) değiştirebilirsiniz. KB cinsinden boyut almak için sayfa sayısını 8 ile çarpın, ardından gerekirse MB'ye dönüştürmek için 2 ^ 10 (= 1024) ile bölün.

sp_spaceused ( http://msdn.microsoft.com/en-us/library/ms188776.aspx ) ayrıca tablo boyutu bilgisi verecektir.


2

Tablo boyutu bilgisini almak için aşağıdaki betiği kullanmayı seviyorum

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  

1

Veritabanına gidin, ardından sağ tıklayıp raporlara ve ardından standart raporlara, sonra da masaya göre disk kullanımına tıklayın. Bu size o veri tabanındaki tüm bilgileri ve onların kayıtlarını, verilerini, indekslerini vb.


0

Her tablonun hacmini hesaplayan aşağıdaki betiği ve toplam veri tabanının bir başka sonuç kümesini kullanabilirsiniz.

    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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.