Published on

June 27, 2012

Comprendre les tailles d’index SQL Server

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 !

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.