2010-02-09 7 views
6

Decir que tengo una tabla:¿Utilizará SQL Server un índice compuesto cuando solo una columna está en la cláusula WHERE?

CREATE TABLE Users (
    Id INT IDENTITY (1, 1), 
    FirstName VARCHAR(40), 
    LastName VARCHAR(40) 
) 

consultas son por lo general en FirstName o LastName , sino también en FirstNameyApellido.

Si creo un índice no agrupado en FirstName y otro en Apellido, entonces mis dos primeras consultas son atendidas. Aparentemente, SQL Server usará index intersection para la otra consulta.

Alternativamente, si tengo en indexees (Nombre) y en (apellido, nombre), puede/no utilizar SQL Server el segundo índice de consultas en un solo Apellido, así como las consultas en ambos?

¿SQL Server almacena partes de índice compuesto de izquierda a derecha o de derecha a izquierda? En otras palabras: ¿construirá la clave como Apellido NombrePrimario o Nombre Apellido? ¿O es libre de elegir uno arbitrariamente?

Respuesta

5

puede/hace SQL Server utiliza el índice (Apellido, Nombre) para las consultas en solo Apellido, así como las consultas en ambos?

Sí, la base de datos usará el índice (Apellido, Nombre) para las consultas sobre Apellido. Será no aunque use este índice para consultas solo en FirstName.

¿Almacena las partes de índice compuesto de izquierda a derecha o de derecha a izquierda?

El almacenamiento está en un B-Tree. Si lo considera almacenado de derecha a izquierda o de izquierda a derecha es solo una útil ayuda de visualización, y no está relacionado con el almacenamiento de datos real.

+0

Quiero decir: al construir la clave para poner en el árbol B, está la clave para un índice compuesto (A, B, C) almacenado como (A, B, C) o (C, B, A), ¿o depende de SQL Server elegir uno arbitrariamente? –

+2

Creo que lo que él quiere decir es cómo se construye la clave. El indicador está de izquierda a derecha, exactamente como usted define la clave. Y es por eso que no se puede usar para buscar el apellido. –

1

Sí, si realiza una consulta solo en LastName, debe utilizar el índice (LastName, FirstName). Por lo tanto, se usaría tanto al consultar solo por Apellido, o Apellido y Nombre juntos.

La pauta general es asegurar que la columna con la mayor selectividad aparezca primero en el índice compuesto ya que esto proporciona la mayor ventaja/reduce el conjunto de resultados antes que las siguientes columnas menos selectivas.

1

Dependiendo de la consulta real que esté enviando, se puede usar un índice compuesto en dos columnas, incluso si solo busca la segunda columna. Sin embargo, no obtendrá una búsqueda de índice, pero muy probablemente un análisis de índice. Si esto es "lo suficientemente bueno" para usted, depende de su entorno específico. La indexación es más un arte que una ciencia y muchos factores diferentes influyen en su decisión sobre cómo indexar una tabla. Siempre es una desventaja, ya que tener demasiados índices en una mesa es tan malo como tener muy pocos. Asegúrese de que sus consultas más importantes estén bien cubiertas y luego, caso por caso, decida si un índice adicional vale su costo.

Además, como no se ha mencionado aún y se proporciona al menos en SQL Server 2005: Permítanme agregar la cláusula INCLUDE para índices no agrupados. Es una adición pasada por alto, pero realmente útil para cualquier estrategia de indexación.

+0

+1 por mencionar index-scan versus index-seek; también incluir. –

Cuestiones relacionadas