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:
- Optimieren nicht gruppierter Indizes mit Vorschlägen für fehlende Indizes
- sys.dm_db_missing_index_columns (Transact-SQL)
- sys.dm_db_missing_index_groups (Transact-SQL)
- sys.dm_db_missing_index_group_stats (Transact-SQL)
- sys.dm_db_missing_index_group_stats_query (Transact-SQL)
- sys.dm_os_sys_info (Transact-SQL)