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.