Verwenden von fehlenden Indexinformationen zum Schreiben von CREATE INDEX-Anweisungen
Dieses Thema enthält Richtlinien und Beispiele für das Verwenden der von Komponenten des Features für fehlende Indizes zurückgegebenen Informationen, um CREATE INDEX-Anweisungen für die fehlenden Indizes zu schreiben.
Anordnen von Spalten in CREATE INDEX-Anweisungen
Komponenten des Features für fehlende Indizes listen Spalten für Gleichheit oder Ungleichheit sowie eingeschlossene Spalten in ihrer Ausgabe auf.
So gibt beispielsweise das XML-Showplanelement MissingIndexes an, ob eine Indexschlüsselspalte für Gleichheit (=) oder Ungleichheit (<, > usw.) im Transact-SQL-Anweisungsprädikat verwendet oder nur zum Abdecken einer Abfrage eingeschlossen wird. Diese Informationen werden als einer der folgenden Werte für das Usage-Attribut des ColumnGroup-Unterelements dargestellt:
<ColumnGroup Usage="EQUALITY">
<ColumnGroup Usage="INEQUALITY">
<ColumnGroup Usage="INCLUDE">
Die dynamischen Verwaltungsobjekte sys.dm_db_missing_index_details und sys.dm_db_missing_index_columns geben Ergebnisse zurück, die angeben, ob eine Indexschlüsselspalte eine Spalte für Gleichheit oder Ungleichheit oder eine eingeschlossene Spalte ist. Das Resultset von sys.dm_db_missing_index_details gibt diese Informationen in den Spalten equality_columns, inequality_columns und included_columns zurück. Das von sys.dm_db_missing_index_columns zurückgegebene Resultset gibt diese Informationen in der column_usage-Spalte zurück.
Beachten Sie die folgenden Richtlinien beim Anordnen von Spalten in den CREATE INDEX-Anweisungen, die Sie anhand der Ausgabe der Komponenten des Features für fehlende Indizes schreiben:
- Listen Sie die Spalten für Gleichheit zuerst auf (äußerst links in der Spaltenliste).
- Listen Sie die Spalten für Ungleichheit nach den Spalten für Gleichheit auf (rechts von den aufgelisteten Spalten für Gleichheit).
- Listen Sie die eingeschlossenen Spalten in der INCLUDE-Klausel der CREATE INDEX-Anweisung auf.
- Ordnen Sie die Spalten für Gleichheit anhand ihrer Selektivität an, um eine sinnvolle Reihenfolge zu bestimmen. Listen Sie also die selektivsten Spalten zuerst auf.
Beispiele
Verwenden der Ausgabe des XML-Showplanelements MissingIndexes
Das Feature für fehlende Indizes nutzt Informationen, die der Abfrageoptimierer automatisch beim Optimieren einer Abfrage generiert. Abfragen müssen jedoch zuerst in der SQL Server-Instanz ausgeführt werden, damit der Optimierer diese fehlende Indexinformation generieren kann.
Im folgenden Beispiel wird das Erstellen einer DDL-Anweisung (Data Definition Language) anhand der vom MissingIndexes-Element zurückgegebenen Informationen dargestellt:
Aktivieren Sie das XML-Showplanfeature mithilfe der Option SET STATISTICS XML ON, und führen Sie die folgende Abfrage für die AdventureWorks-Beispieldatenbank aus:
USE AdventureWorks; GO SET STATISTICS XML ON; GO SELECT CustomerID, SalesOrderNumber, SubTotal FROM Sales.SalesOrderHeader WHERE ShipMethodID > 2 AND SubTotal > 500.00 AND Freight < 15.00 AND TerritoryID = 5; GO
Zeigen Sie die zurückgegebene Ausgabe im MissingIndexes-Element des erstellten Showplans an:
<MissingIndexes>
<MissingIndexGroup Impact="95.8296">
<MissingIndex Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderHeader]">
<ColumnGroup Usage="EQUALITY">
<Column Name="[TerritoryID]" ColumnId="14" />
</ColumnGroup>
<ColumnGroup Usage="INEQUALITY">
<Column Name="[ShipMethodID]" ColumnId="17" />
<Column Name="[SubTotal]" ColumnId="21" />
<Column Name="[Freight]" ColumnId="23" />
</ColumnGroup>
<ColumnGroup Usage="INCLUDE">
<Column Name="[SalesOrderNumber]" ColumnId="8" />
<Column Name="[CustomerID]" ColumnId="11" />
</ColumnGroup>
</MissingIndex>
</MissingIndexGroup>
</MissingIndexes>
Erstellen Sie den fehlenden Index mithilfe der in den Elementen MissingIndex und ColumnGroup zurückgegebenen Informationen, um eine CREATE INDEX DDL-Anweisung folgendermaßen zu schreiben:
USE AdventureWorks; GO IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_SalesOrderHeader_TerritoryID') DROP INDEX IX_SalesOrderHeader_TerritoryID ON Sales.SalesOrderHeader; GO CREATE NONCLUSTERED INDEX IX_SalesOrderHeader_TerritoryID ON Sales.SalesOrderHeader (TerritoryID, ShipMethodID, SubTotal, Freight) INCLUDE (SalesOrderNumber, CustomerID); GO
Diese CREATE INDEX-Anweisung verwendet den im MissingIndex-Element aufgelisteten Namen der Datenbank (
USE AdventureWorks
), des Schemas und der Tabelle (ON Sales.SalesOrderHeader
). Darüber hinaus verwendet sie die für jedes ColumnGroup-Unterelement für die Schlüsselspalten (TerritoryID, ShipMethodID, SubTotal, Freight
) und Nichtschlüsselspalten (INCLUDE (SalesOrderNumber, CustomerID)
) aufgelisteten Spalten.
Verwenden der von einem dynamischen Verwaltungsobjekt zurückgegebenen Ergebnisse
Sie können fehlende Indexinformationen erst abrufen, nachdem Sie Abfragen in der SQL Server-Instanz ausgeführt haben, damit der Abfrageoptimierer die fehlenden Indexinformationen generieren kann.
Im folgenden Beispiel wird das Erstellen einer DDL-Anweisung anhand der Informationen von der dynamischen Verwaltungssicht sys.dm_db_missing_index_details dargestellt.
Führen Sie die folgende Abfrage für die AdventureWorks-Beispieldatenbank aus:
USE AdventureWorks; GO SELECT City, StateProvinceID, PostalCode FROM Person.Address WHERE StateProvinceID = 9; GO
Führen Sie die folgenden Abfrage für die dynamische Verwaltungssicht sys.dm_db_missing_index_details aus:
SELECT * FROM sys.dm_db_missing_index_details
Die Abfrage dieser dynamischen Verwaltungssicht gibt die folgenden Ergebnisse zurück:
index_handle | database_id | object_id | equality_columns | inequality_columns | included_columns | statement |
---|---|---|---|---|---|---|
1 |
6 |
53575229 |
[StateProvince] |
NULL |
[City], [PostalCode] |
[AdventureWorks].[Person].[Address] |
Nach der Abfrage der dynamischen Verwaltungssicht sys.dm_db_missing_index_details können Sie den fehlenden Index anhand der in den Spalten equality_columns, included_columns und statement zurückgegebenen Informationen folgendermaßen erstellen:
USE AdventureWorks; GO IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_PersonAddress_StateProvinceID') DROP INDEX IX_PersonAddress_StateProvinceID ON Person.Address; GO CREATE NONCLUSTERED INDEX IX_PersonAddress_StateProvinceID ON Person.Address (StateProvinceID) INCLUDE (City, PostalCode); GO
In diesem Beispiel wurden keine Spalten für Ungleichheit (inequality_columns) im Resultset von sys.dm_db_missing_index_details zurückgegeben. Wären sie vorhanden, würden diese Spalten nach den Spalten für Gleichheit (equality_columns) aufgelistet. Spalten, die in included_columns zurückgegeben werden, werden immer in der INCLUDE-Klausel der CREATE INDEX-Anweisung aufgelistet.
Siehe auch
Konzepte
XML-Showplans
Informationen zum Feature für fehlende Indizes
Indizes
Andere Ressourcen
SET STATISTICS XML (Transact-SQL)
CREATE INDEX (Transact-SQL)
sys.dm_db_missing_index_details
sys.dm_db_missing_index_columns