web-dev-qa-db-fra.com

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

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 MyTable dans la base de données SQL Server?

31
Heisenberg

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_msforeachtable comme 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
37
aasim.abdullah

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).

Top Level of Object Explorer Details

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 faisant un clic droit sur la ligne d'en-tête et en choisissant les colonnes que vous souhaitez afficher.

Table data size in SSMS

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

47
Mark Sinkinson

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.

19
Sir Swears-a-lot

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 pour répondre à 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 ) donnera également des informations sur la taille de la table.

2
Andy Jones

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  
2
AA.SC

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.

1
SQLBen

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