Freigeben über


sys.dm_db_missing_index_details (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

Gibt detaillierte Informationen zu fehlenden Indizes zurück.

In Azure SQL-Datenbank können dynamische Verwaltungssichten keine Informationen verfügbar machen, die sich auf den Datenbankeinschluss auswirken würden oder die sich auf andere Datenbanken beziehen, auf die der Benutzer Zugriff hat. Um zu vermeiden, dass diese Informationen verfügbar gemacht werden, wird jede Zeile mit Daten, die zum verbundenen Mandanten gehören, herausgefiltert.

Spaltenname Datentyp Beschreibung
index_handle int Identifiziert einen bestimmten fehlenden Index. Der Bezeichner ist innerhalb des Servers eindeutig. index_handle ist der Schlüssel dieser Tabelle.
database_id smallint Identifiziert die Datenbank, in der sich die Tabelle mit dem fehlenden Index befindet.

In Azure SQL-Datenbank sind die Werte innerhalb einer einzelnen Datenbank oder eines Pools für elastische Datenbanken eindeutig, aber nicht innerhalb eines logischen Servers.
object_id int Identifiziert die Tabelle, in der der Index fehlt.
equality_columns nvarchar(4000) Durch Trennzeichen getrennte Liste von Spalten, die zu Gleichheitsprädikaten der folgenden Form beitragen:

table.column = constant_value
inequality_columns nvarchar(4000) Durch Trennzeichen getrennte Liste von Spalten, die zu Ungleichheitsprädikaten beispielsweise der folgenden Form beitragen:

table.column>constant_value

Jeder Vergleichsoperator außer "=" drückt Ungleichheit aus.
included_columns nvarchar(4000) Durch Trennzeichen getrennte Liste von Spalten, die zur Abdeckung der Abfrage benötigt werden. Weitere Informationen zum Abdecken oder Einbeziehen von Spalten finden Sie unter Erstellen von Indizes mit eingeschlossenen Spalten.

Ignorieren Sie bei speicheroptimierten Indizes (sowohl Hash- als auch speicheroptimiert nicht gruppiert included_columns). Alle Spalten der Tabelle werden in jeden speicheroptimierten Index eingeschlossen.
Anweisung nvarchar(4000) Der Name der Tabelle, in der der Index fehlt.

Hinweise

Die von sys.dm_db_missing_index_details der Abfrage zurückgegebenen Informationen werden aktualisiert, wenn eine Abfrage vom Abfrageoptimierer optimiert und nicht beibehalten wird. Fehlende Indexinformationen werden nur aufbewahrt, bis das Datenbankmodul neu gestartet wird. Datenbankadministratoren sollten regelmäßig Sicherungskopien der Informationen zu fehlenden Indizes erstellen, wenn Sie sie nach dem Wiederverwenden des Servers beibehalten möchten. Verwenden Sie die sqlserver_start_time-Spalte in sys.dm_os_sys_info, um die aktuellste Startzeit der Datenbank-Engine zu suchen.

Um zu ermitteln, welche fehlenden Indexgruppen ein bestimmter fehlender Index Teil ist, können Sie die sys.dm_db_missing_index_groups dynamische Verwaltungsansicht abfragen, indem Sie sie sys.dm_db_missing_index_details auf der Grundlage der index_handle Spalte gleichschalten.

Hinweis

Das Resultset für diesen DMV ist auf 600 Zeilen beschränkt. Jede Zeile enthält einen fehlenden Index. Wenn mehr als 600 Indizes fehlen, sollten Sie die vorhandenen fehlenden Indizes adressieren, damit Sie die neueren anzeigen können.

Verwenden fehlender Indexinformationen in CREATE INDEX-Anweisungen

Um die von ihnen zurückgegebenen sys.dm_db_missing_index_details Informationen in eine CREATE INDEX-Anweisung für speicheroptimierte und datenträgerbasierte Indizes zu konvertieren, sollten Gleichheitsspalten vor den Ungleichheitsspalten platziert werden, und zusammen sollten sie den Schlüssel des Indexes bilden. Eingeschlossene Spalten sollten der CREATE INDEX-Anweisung mithilfe der INCLUDE-Klausel hinzugefügt werden. Für eine effektive Reihenfolge der Gleichheitsspalten sortieren Sie sie nach ihrer Selektivität, wobei Sie die ausgewählten Spalten zuerst (am weitesten links in der Spaltenliste) aufführen. Weitere Informationen finden Sie unter Optimieren nicht gruppierter Indizes mit fehlenden Indexvorschlägen, einschließlich Einschränkungen des fehlenden Indexfeatures.

Weitere Informationen zu speicheroptimierten Indizes finden Sie unter "Indizes für speicheroptimierte Tabellen".

Transaktionskonsistenz

Wenn durch eine Transaktion eine Tabelle erstellt oder gelöscht wird, werden die Zeilen mit Informationen zu fehlenden Indizes bezüglich der gelöschten Objekte aus diesem dynamischen Verwaltungsobjekt entfernt, damit die Transaktionskonsistenz erhalten bleibt. Erfahren Sie mehr über Einschränkungen des fehlenden Indexfeatures.

Berechtigungen

Für SQL Server und SQL Managed Instance ist die VIEW SERVER STATE-Berechtigung erforderlich.

Für die SQL-Datenbank-Ziele Basic, S0 und S1 sowie für Datenbanken in Pools für elastische Datenbanken ist das Konto des Serveradministrators oder des Microsoft Entra-Administratorkontos oder die Mitgliedschaft in der ##MS_ServerStateReader## Serverrolle erforderlich. Für alle anderen SQL-Datenbank-Dienstziele ist entweder die VIEW DATABASE STATE-Berechtigung für die Datenbank oder die Mitgliedschaft in der ##MS_ServerStateReader##-Serverrolle erforderlich.

Berechtigungen für SQL Server 2022 und höher

Erfordert die VIEW SERVER PERFORMANCE STATE-Berechtigung auf dem Server.

Beispiele

Im folgenden Beispiel werden fehlende Indexvorschläge für die aktuelle Datenbank zurückgegeben. Fehlende Indexvorschläge sollten nach Möglichkeit miteinander und mit vorhandenen Indizes in der aktuellen Datenbank kombiniert werden. Erfahren Sie, wie Sie diese Vorschläge in nicht gruppierten Indizes mit fehlenden Indexvorschlägen anwenden.

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

Hinweis

Das Skript zur Indexerstellung in der Tiger Toolbox von Microsoft untersucht DMVs für fehlende Indizes und entfernt automatisch alle redundanten vorgeschlagenen Indizes, analysiert Indizes mit geringen Auswirkungen und generiert Skripts für die Indexerstellung für die Überprüfung durch Sie. Wie in der Abfrage oben werden KEINE Befehle zum Erstellen von Indizes ausgeführt. Das Skript für die Indexerstellung eignet sich für SQL Server und Azure SQL Managed Instance. Erwägen Sie für Azure SQL-Datenbank, die automatische Indexoptimierung zu implementieren.

Nächste Schritte

Weitere Informationen zum fehlenden Indexfeature finden Sie in den folgenden Artikeln: