Accueil / Ressources / Index manquants regroupés par table

› Script SQL

Liste des index manquants regroupés par table.

SQL Server mémorise, à chaque compilation de plan, les index qui auraient réduit le coût d'une requête. Ces suggestions sont précieuses, mais brutes : elles se chevauchent et ne tiennent pas compte des index existants. Les regrouper par table permet de les arbitrer.


Les requêtes de cette page lisent des informations de l'instance sans modifier vos données. Les commandes qui modifient quelque chose sont signalées dans le texte. Testez toujours sur un environnement non critique avant la production, et relisez chaque requête avant de l'exécuter.

Le script

Deux résultats : une vue par table, pour savoir où concentrer l'effort, puis le détail des suggestions avec une ébauche de commande de création.

T-SQL
-- Index manquants suggérés par SQL Server, regroupés par table
-- À exécuter dans la base à analyser. Droit requis : VIEW SERVER STATE.
-- Les suggestions sont remises à zéro au redémarrage du service.
SET NOCOUNT ON;

-- A. Synthèse par table
SELECT
    d.statement                                          AS table_cible,
    COUNT(*)                                             AS nb_suggestions,
    SUM(gs.user_seeks + gs.user_scans)                   AS nb_utilisations,
    CONVERT(decimal(38, 0),
        SUM(gs.avg_total_user_cost * gs.avg_user_impact
            * (gs.user_seeks + gs.user_scans)))          AS gain_estime_total,
    MAX(gs.last_user_seek)                               AS derniere_utilisation
FROM sys.dm_db_missing_index_details AS d
JOIN sys.dm_db_missing_index_groups  AS g
     ON g.index_handle = d.index_handle
JOIN sys.dm_db_missing_index_group_stats AS gs
     ON gs.group_handle = g.index_group_handle
WHERE d.database_id = DB_ID()
GROUP BY d.statement
ORDER BY gain_estime_total DESC;

-- B. Détail des suggestions, avec une ébauche de commande (à relire avant exécution)
SELECT
    d.statement                                          AS table_cible,
    CONVERT(decimal(38, 0),
        gs.avg_total_user_cost * gs.avg_user_impact
        * (gs.user_seeks + gs.user_scans))               AS gain_estime,
    gs.avg_user_impact                                   AS gain_pct_estime_par_requete,
    gs.user_seeks                                        AS seeks,
    gs.user_scans                                        AS scans,
    gs.last_user_seek                                    AS derniere_utilisation,
    d.equality_columns,
    d.inequality_columns,
    d.included_columns,
    N'CREATE NONCLUSTERED INDEX [IX_a_nommer] ON ' + d.statement
        + N' (' + ISNULL(d.equality_columns, N'')
        + CASE WHEN d.equality_columns IS NOT NULL AND d.inequality_columns IS NOT NULL
               THEN N', ' ELSE N'' END
        + ISNULL(d.inequality_columns, N'') + N')'
        + ISNULL(N' INCLUDE (' + d.included_columns + N')', N'') AS ordre_creation
FROM sys.dm_db_missing_index_details AS d
JOIN sys.dm_db_missing_index_groups  AS g
     ON g.index_handle = d.index_handle
JOIN sys.dm_db_missing_index_group_stats AS gs
     ON gs.group_handle = g.index_group_handle
WHERE d.database_id = DB_ID()
ORDER BY d.statement, gain_estime DESC;

Comment lire le résultat

  • gain_estime : coût de la requête multiplié par le gain estimé et par le nombre d'utilisations. C'est un ordre de grandeur pour comparer les suggestions entre elles, pas une durée.
  • equality_columns : colonnes utilisées avec un égal, à placer en premier dans l'index. inequality_columns : colonnes en comparaison (plus grand, plus petit, entre). included_columns : colonnes à inclure pour couvrir la requête.
  • nb_suggestions élevé sur une même table : plusieurs suggestions se recoupent sûrement. Elles se fusionnent souvent en un seul index.

Les limites de cette source

  • Les index suggérés ne tiennent pas compte de la taille des clés ni du coût en écriture. Un index à dix colonnes incluses est rarement une bonne idée.
  • La liste est limitée (environ 500 groupes) et vidée à chaque redémarrage.
  • Ne créez jamais les suggestions telles quelles : vérifiez d'abord les index existants, fusionnez les propositions proches, et testez l'effet sur les écritures.
  • Les suggestions ne couvrent pas les index columnstore, filtrés complexes ni les vues indexées.

Un incident, un audit, une question ?

Un premier échange suffit à cadrer l'urgence et le périmètre.

Demander une intervention