So bestimmen Sie die Größe meiner Tabellen in der SQL Server-Datenbank

28

Gibt es eine integrierte Funktion / gespeicherte Prozedur / Abfrage, die hilfreich ist, um Informationen zur Größe MyTablein der SQL Server-Datenbank abzurufen ?

Heisenberg
quelle
Diese Antwort auf SO hat ein Skript, das ziemlich einfach ist und keine undokumentierte Prozedur erfordert.
Shawn Melton
Die Antwort von AA.SC ist sehr nützlich, mit der Ausnahme, dass die msdb-Datenbankkennung aus allen DMVs im Join entfernt werden muss. Gegenwärtig werden nur Tabellen in msdb selbst gemeldet!
WaitForPete

Antworten:

34

Für einzelne Tabellen können Sie verwenden

sp_spaceused MyTable

Für alle Tabellen in einer Datenbank können Sie es sp_msforeachtablewie folgt verwenden

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
aasim.abdullah
quelle
45

Wenn Sie kein Skript schreiben möchten, können Sie auch die häufig nicht verwendeten 'Objekt-Explorer-Details' in SSMS öffnen (Tastenkürzel F7).

Oberste Ebene der Objekt-Explorer-Details

Öffnen Sie auf der obersten Ebene den Ordner "Tabellen", um eine Liste aller Tabellen in Ihrer Datenbank abzurufen.

Möglicherweise müssen Sie die Spalten anpassen, um den belegten Speicherplatz anzuzeigen. Klicken Sie dazu mit der rechten Maustaste auf die Kopfzeile und wählen Sie die Spalten aus, die Sie anzeigen möchten.

Tabellendatengröße in SSMS

In den Details des Objekt-Explorers sind noch viele weitere Daten verfügbar.

Mark Sinkinson
quelle
3
Viel schöner als der oben beschriebene T-SQL-Ansatz (der bei mir nicht funktioniert hat)
Orion Edwards
17

Klicken Sie in SSMS mit der rechten Maustaste auf "Datenbank" und wählen Sie "Berichte", "Standardberichte" und "Datenträgernutzung nach Top-Tabellen".

Der Bericht gibt die Anzahl der Zeilen und Kilobyte an, die pro Tabelle verwendet werden.

Sir schwört viel
quelle
2

Sehen Sie sich sys.dm_db_partition_stats an ( http://msdn.microsoft.com/en-us/library/ms187737.aspx ).

Es gibt einige Beispielabfragen unter diesem Link und auch unter http://blogs.msdn.com/b/cindygross/archive/2010/04/02/dmv-series-sys-dm-db-partition-stats.aspx

Sie können Änderungen an Ihre Anforderungen anpassen, z. B. nicht gruppierte Indizes ein- und ausfiltern. Multiplizieren Sie die Seitenzahl mit 8, um die Größe in KB zu erhalten, und dividieren Sie sie durch 2 ^ 10 (= 1024), um sie bei Bedarf in MB umzuwandeln.

sp_spaceused ( http://msdn.microsoft.com/en-us/library/ms188776.aspx ) gibt auch Informationen zur Tabellengröße an.

Andy Jones
quelle
2

Um Informationen zur Tabellengröße zu erhalten, verwende ich gerne das folgende Skript

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  
AA.SC
quelle
1

Gehen Sie zur Datenbank und klicken Sie mit der rechten Maustaste auf Berichte, dann auf Standardberichte und anschließend auf Datenträgerverwendung nach Tabelle. Auf diese Weise erhalten Sie alle Daten in dieser Datenbank sowie Ihre Datensätze, Daten, Indizes usw

SQLBen
quelle
0

Sie können das folgende Skript verwenden, das das Volumen für jede Tabelle und eine andere Ergebnismenge der Summe pro Datenbank berechnet

    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
hkravitz
quelle