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?
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?
Réponses:
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
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).
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.
Il y a beaucoup plus de données comme celle-ci disponibles dans les détails de l'Explorateur d'objets.
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.
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.
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
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