sys.dm_db_missing_index_details (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de données SQL dans Microsoft Fabric

Retourne des informations détaillées sur les index manquants.

Dans Azure SQL Database, les vues de gestion dynamique ne peuvent pas exposer des informations qui affecteraient le contenu de la base de données ou révéler des informations sur d’autres bases de données auxquelles l’utilisateur a accès. Pour éviter d’exposer ces informations, chaque ligne qui contient des données qui n’appartiennent pas au locataire connecté est filtrée.

Nom de la colonne Type de données Description
index_handle int Identifie un index manquant. L'identificateur est unique sur le serveur. index_handle est la clé de ce tableau.
database_id smallint Identifie la base de données dans laquelle réside la table comportant les index manquants.

Dans la base de données Azure SQL, les valeurs sont uniques au sein d’une base de données unique ou d’un pool élastique, mais pas dans un serveur logique.
object_id int Identifie la table dans laquelle est situé l'index manquant.
equality_columns nvarchar(4000) Liste de colonnes, séparées par des virgules, qui contribuent aux prédicats d'égalité au format :

table.column = constant_value
inequality_columns nvarchar(4000) Liste de colonnes, séparées par des virgules, qui contribuent aux prédicats d'inégalité, par exemple, les prédicats au format :

table.column>constant_value

Tout opérateur de comparaison autre que "=" exprime l'inégalité.
included_columns nvarchar(4000) Liste de colonnes, séparées par des virgules, requises comme colonnes de couverture pour la requête. Pour plus d’informations sur la couverture ou les colonnes incluses, consultez Créer des index avec des colonnes incluses.

Pour les index à mémoire optimisée (hachage et non cluster à mémoire optimisée), ignorez included_columns. Toutes les commandes de la table sont incluses dans chaque index optimisé en mémoire.
déclaration nvarchar(4000) Nom de la table dans laquelle est situé l'index manquant.

Remarques

Les informations retournées par sys.dm_db_missing_index_details sont mises à jour lorsqu’une requête est optimisée par l’optimiseur de requête et n’est pas conservée. Les informations d’index manquantes sont conservées uniquement tant que le moteur de base de données n’est pas redémarré. Les administrateurs de base de données doivent effectuer régulièrement des copies de sauvegarde des informations sur les index manquants s'ils souhaitent les conserver après le recyclage du serveur. Utilisez la colonne sqlserver_start_time dans sys.dm_os_sys_info pour rechercher la dernière heure de démarrage du moteur de base de données.

Pour déterminer les groupes d’index manquants dont un index manquant particulier fait partie, vous pouvez interroger la sys.dm_db_missing_index_groups vue de gestion dynamique en l’équijoinant en sys.dm_db_missing_index_details fonction de la index_handle colonne.

Note

Le jeu de résultats pour cette vue de gestion dynamique est limité à 600 lignes. Chaque ligne contient un index manquant. Si vous avez plus de 600 index manquants, vous devez traiter les index manquants existants afin de pouvoir afficher les plus récents.

Utilisation des informations d’index manquantes dans les CREATE INDEX instructions

Pour convertir l’information retournée en sys.dm_db_missing_index_details une CREATE INDEX instruction pour les index optimisés en mémoire et basés sur disque, les colonnes d’égalité doivent être placées avant les colonnes d’inégalité, et ensemble elles doivent former la clé de l’index. Les colonnes incluses doivent être ajoutées à l’énoncé CREATE INDEX en utilisant la clause INCLUDE. Pour définir un ordre efficace pour les colonnes d’égalité, classez-les en fonction de leur sélectivité : placez d’abord les colonnes les plus sélectives (à gauche dans la liste des colonnes). En savoir plus sur l’optimisation des index non cluster avec des suggestions d’index manquantes, notamment les limitations de la fonctionnalité d’index manquante.

Pour plus d’informations sur les index à mémoire optimisée, consultez Index pour les tables mémoire optimisées.

Cohérence des transactions

Si une transaction crée ou supprime une table, les lignes qui contiennent les informations d'index manquants concernant les objets supprimés sont retirées de cet objet de gestion dynamique, ce qui permet de préserver la cohérence des transactions. En savoir plus sur les limitations de la fonctionnalité d’index manquante.

Permissions

Sur SQL Server et SQL Managed Instance, vous devez disposer d’une autorisation VIEW SERVER STATE.

Sur sql Database de base, S0et objectifs de service S1, et pour les bases de données dans pools élastiques, le compte d’administrateur de serveur, le compte Administrateur Microsoft Entra ou l’appartenance au rôle serveur ##MS_ServerStateReader## est nécessaire. Sur tous les autres objectifs de service SQL Database, l’autorisation VIEW DATABASE STATE sur la base de données ou l’appartenance au rôle serveur ##MS_ServerStateReader## est requise.

Autorisations pour SQL Server 2022 et versions ultérieures

Nécessite VIEW une autorisation ÉTAT DE PERFORMANCE DU SERVEUR sur le serveur.

Examples

L’exemple suivant retourne des suggestions d’index manquantes pour la base de données active. Les suggestions d’index manquantes doivent être combinées si possible avec les autres et avec des index existants dans la base de données active. Découvrez comment appliquer ces suggestions dans l’optimisation des index non cluster avec des suggestions d’index manquantes.

SELECT
  CONVERT (varchar(30), getdate(), 126) AS runtime,  mig.index_group_handle,  mid.index_handle,
  CONVERT (decimal (28, 1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) ) AS improvement_measure,
  'CREATE INDEX missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) + ' ON ' + mid.statement + ' (' + ISNULL (mid.equality_columns, '') + CASE
    WHEN mid.equality_columns IS NOT NULL
    AND mid.inequality_columns IS NOT NULL THEN ','
    ELSE ''
  END + ISNULL (mid.inequality_columns, '') + ')' + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
  migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
	INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
	INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE CONVERT (decimal (28, 1),migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

Note

Le script Index-Creation dans Tiger Toolbox de Microsoft examine les vues DMV d’index manquants et supprime automatiquement tous les index suggérés redondants. De plus, il analyse les index à faible impact et génère des scripts de création d’index que vous pouvez passer en revue. Comme dans la requête ci-dessus, il n’exécute PAS les commandes de création d’index. Le script Index-Creation convient à SQL Server et Azure SQL Managed Instance. Pour Azure SQL Database, implémentez le paramétrage automatique d’index.