Come determinare la dimensione delle mie tabelle nel database di SQL Server


28

Esiste una funzione integrata / stored procedure / query che è utile per recuperare informazioni sulla dimensione del MyTabledatabase di SQL Server?


Questa risposta su SO ha uno script che è piuttosto semplice e non richiede una procedura non documentata.
Shawn Melton,

La risposta fornita da AA.SC è molto utile, tranne per il fatto che l'identificatore del database msdb deve essere rimosso da tutti i DMV nel join. Allo stato attuale, riporta solo sulle tabelle in msdb stesso!
WaitForPete,

Risposte:


34

Per tavolo singolo puoi usare

sp_spaceused MyTable

Per tutte le tabelle in un database è possibile utilizzarlo sp_msforeachtablecome segue

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

Se non si desidera scrivere uno script, è anche possibile aprire i "Dettagli esploratore oggetti" sottoutilizzati in SSMS (tasto di scelta rapida F7).

Primo livello dei dettagli di Esplora oggetti

Dal livello superiore, aprire la cartella Tabelle per ottenere un elenco di tutte le tabelle nel database.

Potrebbe essere necessario personalizzare le colonne per visualizzare lo spazio utilizzato. Questo può essere fatto facendo clic con il tasto destro sulla riga di intestazione e scegliendo le colonne che si desidera visualizzare.

Dimensione dei dati della tabella in SSMS

Ci sono molti più dati come questo disponibili in Dettagli Esplora oggetti.


3
Molto più bello dell'approccio t-sql sopra (che non ha funzionato per me)
Orion Edwards

17

In SSMS fare clic con il pulsante destro del mouse su Database, selezionare Rapporti, Rapporti standard, Utilizzo del disco in base alle tabelle principali.

Il rapporto ti fornirà il numero di righe e kilobyte utilizzati per tabella.


2

Dai un'occhiata a sys.dm_db_partition_stats ( http://msdn.microsoft.com/en-us/library/ms187737.aspx ).

Ci sono alcune query di esempio a quel link e anche su http://blogs.msdn.com/b/cindygross/archive/2010/04/02/dmv-series-sys-dm-db-partition-stats.aspx

È possibile modificare in base alle proprie esigenze, ad esempio filtrare in / out indici non cluster. Moltiplicare il conteggio delle pagine per 8 per ottenere le dimensioni in KB, quindi dividere per 2 ^ 10 (= 1024) per convertire in MB, se necessario.

sp_spaceused ( http://msdn.microsoft.com/en-us/library/ms188776.aspx ) fornirà anche informazioni sulla dimensione della tabella.


2

Per ottenere informazioni sulla dimensione della tabella, mi piace usare il seguente script

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

Vai al database, quindi fai clic con il pulsante destro del mouse e fai clic su rapporti, quindi su rapporti standard, quindi sull'utilizzo del disco per tabella. Questo ti darà tutti i file in quel database e i loro record, dati, indici ecc


0

è possibile utilizzare il seguente script che calcola il volume per ogni tabella e un altro set di risultati del totale per base di dati

    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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.