Comment déterminer la taille de mes tables dans la base de données SQL Server


28

Existe-t-il une fonction / procédure stockée / requête intégrée qui est utile pour récupérer des informations sur la taille de MyTabledans la base de données SQL Server?


Cette réponse sur SO a un script qui est assez simple et ne nécessite pas de procédure non documentée.
Shawn Melton

La réponse donnée par AA.SC est très utile, sauf que l'identifiant de la base de données msdb doit être supprimé de tous les DMV de la jointure. En l'état, il ne fait état que des tables dans msdb lui-même!
WaitForPete

Réponses:


34

Pour une table unique, vous pouvez utiliser

sp_spaceused MyTable

Pour toutes les tables d'une base de données, vous pouvez l'utiliser avec sp_msforeachtablecomme suit

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

Si vous ne voulez pas écrire de script, vous pouvez également ouvrir les «Détails de l'explorateur d'objets» sous-utilisés dans SSMS (touche de raccourci F7).

Détails de niveau supérieur de l'explorateur d'objets

Depuis le niveau supérieur, ouvrez le dossier Tables pour obtenir une liste de toutes les tables de votre base de données.

Vous devrez peut-être personnaliser les colonnes pour voir l'espace utilisé. Cela peut être fait en cliquant avec le bouton droit sur la ligne d'en-tête et en choisissant les colonnes que vous souhaitez afficher.

Taille des données de table dans SSMS

Il y a beaucoup plus de données comme celle-ci disponibles dans les détails de l'Explorateur d'objets.


3
Beaucoup plus agréable que l'approche t-sql ci-dessus (qui n'a pas fonctionné pour moi)
Orion Edwards

17

Dans SSMS, cliquez avec le bouton droit sur Base de données, sélectionnez Rapports, Rapports standard, Utilisation du disque par les meilleures tables.

Le rapport vous donnera le nombre de lignes et de kilo-octets utilisés par table.


2

Jetez un œil à sys.dm_db_partition_stats ( http://msdn.microsoft.com/en-us/library/ms187737.aspx ).

Il existe des exemples de requêtes sur ce lien et également sur http://blogs.msdn.com/b/cindygross/archive/2010/04/02/dmv-series-sys-dm-db-partition-stats.aspx

Vous pouvez modifier en fonction de vos besoins, c'est-à-dire filtrer les index non clusterisés d'entrée / sortie. Multipliez le nombre de pages par 8 pour obtenir la taille en Ko, puis divisez par 2 ^ 10 (= 1024) pour convertir en Mo si nécessaire.

sp_spaceused ( http://msdn.microsoft.com/en-us/library/ms188776.aspx ) fournira également des informations sur la taille de la table.


2

Pour obtenir des informations sur la taille de la table, j'aime utiliser le script suivant

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

Accédez à la base de données, puis cliquez avec le bouton droit et cliquez sur les rapports, puis les rapports standard, puis l'utilisation du disque par table. Cela vous donnera tous les fichiers de cette base de données et leurs enregistrements, données, index, etc.


0

vous pouvez utiliser le script suivant qui calcule le volume pour chaque table et un autre jeu de résultats du total par base de données

    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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.