Tengo la siguiente consulta:
select top 500 * from clicks
where domainid = 'AC8BBCA4-1CC4-456E-9A85-E7A5C0D7E981'
order by clickedOn
Me pregunto qué índice se obtienen mejores resultados?
CREATE NONCLUSTERED INDEX [IX_p2p] ON [dbo].[clicks]
(
[domainId],
[clickedOn] ASC
)
¿O esto?
CREATE NONCLUSTERED INDEX [IX_p2p] ON [dbo].[clicks]
(
[clickedOn] ASC,
[domainId]
)
El primer índice es claramente mejor que el segundo para esta consulta.
En el primer caso se puede buscar en el exacto domainid
y luego leer las primeras 500 filas, las cuales ya están en clickedOn
orden, y luego parada (más de 500 operaciones de búsqueda para obtener los otros valores de la columna si la tabla tiene más de las dos columnas se muestra).
El segundo índice podría ser útil para la consulta pero sólo en circunstancias muy limitadas. Evita la necesidad de ordenar clickedOn
pero requiere examine el índice en orden y parar después de las primeras 500 filas que coinciden con el domainId
se encuentran. Si usted es muy afortunado entonces las primeras 500 filas en clickedOn
orden también coincidir con el domainId
predicado por lo que también tiene que leer solamente 500 filas. Pero lo más probable es que esto no será el caso. En el peor de los casos ni siquiera hay 500 filas coincidentes que se encuentran y se tiene que leer todo el índice. También lo tiene que hacer las operaciones de búsqueda 500 para obtener los otros valores de la columna.
Si la tabla es relativamente pequeña que, ni índice puede ser utilizado como SQL Server puede decidir la exploración de un índice de cobertura y la clasificación es más barato que los 500 búsquedas.