Lorsque vous travaillez avec SQL Server, il est important de comprendre la taille des index sur une table. Bien que la procédure stockée sp_spaceused
fournisse la taille globale d’une table et de ses index, elle ne donne pas la taille des index individuels. Dans cet article, nous explorerons deux requêtes qui peuvent vous aider à capturer la taille des index individuels sur une table.
Requête 1 : Utilisation de sys.indexes et sys.dm_db_partition_stats
La première requête utilise les fonctions de gestion dynamique sys.indexes
et sys.dm_db_partition_stats
pour calculer la taille des index individuels sur une table.
USE <NomDeLaBaseDeDonnées>
GO
--Requête 1
SELECT i.[name] AS NomIndex,
SUM(s.[used_page_count]) * 8 AS TailleIndexKB
FROM sys.dm_db_partition_stats AS s
JOIN sys.indexes AS i ON s.[object_id] = i.[object_id] AND s.[index_id] = i.[index_id]
GROUP BY i.[name]
ORDER BY i.[name]
GO
Cette requête fournit la taille de chaque index sur la table spécifiée en kilo-octets.
Requête 2 : Utilisation de sys.dm_db_index_physical_stats et sys.dm_db_partition_stats
La deuxième requête est plus fiable car elle utilise les fonctions de gestion dynamique sys.dm_db_index_physical_stats
et sys.dm_db_partition_stats
.
USE <NomDeLaBaseDeDonnées>
GO
--Requête 2
SELECT [NomDeLaBaseDeDonnées],
[ObjectId],
[NomObjet],
[IndexId],
[DescriptionIndex],
CONVERT(DECIMAL(16,1), (SUM([avg_record_size_in_bytes] * [record_count]) / (1024.0 * 1024))) AS [TailleIndex(MB)],
[lastupdated] AS [DernièreMiseÀJourStatistiques],
[AvgFragmentationInPercent]
FROM (
SELECT DISTINCT DB_Name(Database_id) AS 'NomDeLaBaseDeDonnées',
OBJECT_ID AS ObjectId,
Object_Name(Object_id) AS NomObjet,
Index_ID AS IndexId,
Index_Type_Desc AS DescriptionIndex,
avg_record_size_in_bytes,
record_count,
STATS_DATE(object_id, index_id) AS 'lastupdated',
CONVERT([varchar](512), ROUND(Avg_Fragmentation_In_Percent, 3)) AS 'AvgFragmentationInPercent'
FROM sys.dm_db_index_physical_stats(db_id('PM_Db'), NULL, NULL, NULL, 'detailed')
WHERE OBJECT_ID IS NOT NULL AND Avg_Fragmentation_In_Percent <> 0
) T
GROUP BY NomDeLaBaseDeDonnées, ObjectId, NomObjet, IndexId, DescriptionIndex, lastupdated, AvgFragmentationInPercent
Cette requête fournit la taille de chaque index sur la table spécifiée en mégaoctets, ainsi que des informations supplémentaires telles que la date de la dernière mise à jour et le pourcentage moyen de fragmentation.
En utilisant ces requêtes, vous pouvez facilement capturer la taille des index individuels sur une table dans SQL Server. Ces informations peuvent être précieuses pour l’optimisation des performances.
J’espère que vous trouverez ces informations utiles dans votre parcours SQL Server !