Usar la información de índices que faltan para escribir instrucciones CREATE INDEX
Este tema contiene directrices y ejemplos para el uso de la información devuelta por los componentes de la característica de índices que faltan que podrá usar para escribir las instrucciones CREATE INDEX en los índices que faltan.
Ordenar columnas en las instrucciones CREATE INDEX
La salida de los componentes de la característica de índices que faltan muestra una lista de las columnas de igualdades, de desigualdades e incluidas.
Por ejemplo, el elemento MissingIndexes del plan de presentación XML indica si una columna de clave de índice se utiliza para búsquedas de igualdad (=) o desigualdad (<, >, etc.) en el predicado de la instrucción Transact-SQL, o si sólo se incluye para cubrir una consulta. Muestra esta información como uno de los siguientes valores del atributo Usage del subelemento ColumnGroup:
<ColumnGroup Usage="EQUALITY">
<ColumnGroup Usage="INEQUALITY">
<ColumnGroup Usage="INCLUDE">
Los objetos de administración dinámica sys.dm_db_missing_index_details y sys.dm_db_missing_index_columns devuelven resultados que indican si una columna de clave de índice es una columna de igualdades, desigualdades o incluida. El conjunto de resultados de sys.dm_db_missing_index_details devuelve esta información en las columnas equality_columns, inequality_columns e included_columns. El conjunto de resultados devuelto por sys.dm_db_missing_index_columns devuelve esta información en su columna column_usage.
Use las siguientes directrices para ordenar columnas en las instrucciones CREATE INDEX que se escriben a partir de la salida de la característica de índices que faltan:
- Enumere primero las columnas de igualdades (extremo izquierdo de la lista de columnas).
- Enumere las columnas de desigualdades después de las columnas de igualdades (a la derecha de las columnas de igualdades que aparecen en la lista).
- Enumere las columnas incluidas en la cláusula INCLUDE de la instrucción CREATE INDEX.
- Para determinar un orden eficaz de las columnas de igualdades, ordénelas según su selectividad; es decir, ponga primero en la lista las columnas más selectivas.
Ejemplos
Usar la salida del elemento MissingIndexes del plan de presentación XML
La característica de índices que faltan utiliza la información que el optimizador de consultas genera de forma automática cuando optimiza una consulta. Sin embargo, primero se deben ejecutar las consultas en la instancia de SQL Server, de modo que el optimizador pueda generar esta información de índices que faltan.
El siguiente ejemplo muestra cómo crear una instrucción del lenguaje de definición de datos (DDL) a partir de la información devuelta por el elemento MissingIndexes:
Active la característica del plan de presentación XML mediante la opción SET STATISTICS XML ON y ejecute la siguiente consulta en la base de datos de ejemplo AdventureWorks:
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
Examine la salida devuelta en el elemento MissingIndexes del plan de presentación generado:
<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>
Cree el índice que falta utilizando la información devuelta en los elementos MissingIndex y ColumnGroup para escribir una instrucción CREATE INDEX DDL, de la siguiente forma:
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
Esta instrucción CREATE INDEX utiliza la base de datos (
USE AdventureWorks
), el esquema y el nombre de tabla (ON Sales.SalesOrderHeader
) que aparecen en la lista del elemento MissingIndex. También utiliza las columnas de la lista para cada subelemento ColumnGroup de las columnas de clave (TerritoryID, ShipMethodID, SubTotal, Freight
) y columnas sin clave (INCLUDE (SalesOrderNumber, CustomerID)
).
Usar los resultados devueltos por un objeto de administración dinámica
Antes de recuperar la información de índices que faltan, debe ejecutar las consultas en la instancia de SQL Server de forma que el optimizador de consultas pueda generar la información de índices que faltan.
El siguiente ejemplo muestra cómo crear una instrucción DDL a partir de la información devuelta por la vista de administración dinámica sys.dm_db_missing_index_details:
Ejecute la siguiente consulta en la base de datos de ejemplo AdventureWorks:
USE AdventureWorks; GO SELECT City, StateProvinceID, PostalCode FROM Person.Address WHERE StateProvinceID = 9; GO
Ejecute la siguiente consulta en la vista de administración dinámica sys.dm_db_missing_index_details:
SELECT * FROM sys.dm_db_missing_index_details
Consultar esta vista de administración dinámica devuelve los siguientes resultados:
index_handle | database_id | object_id | equality_columns | inequality_columns | included_columns | statement |
---|---|---|---|---|---|---|
1 |
6 |
53575229 |
[StateProvince] |
NULL |
[City], [PostalCode] |
[AdventureWorks].[Person].[Address] |
Una vez que se ha consultado la vista de administración dinámica sys.dm_db_missing_index_details, puede crear el índice que falta utilizando la información devuelta en las columnas equality_columns, included_columns y statement, de la siguiente forma:
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
En este ejemplo, no se ha devuelto ninguna columna inequality_columns en el conjunto de resultados sys.dm_db_missing_index_details. Si se hubiesen devuelto, se pondrían en la lista después de las columnas equality_columns. Las columnas devueltas en included_columns siempre aparecen en la lista de la cláusula INCLUDE de la instrucción CREATE INDEX.
Vea también
Conceptos
Planes de presentación XML
Acerca de la característica de índices que faltan
Índices
Otros recursos
SET STATISTICS XML (Transact-SQL)
CREATE INDEX (Transact-SQL)
sys.dm_db_missing_index_details
sys.dm_db_missing_index_columns