2009-10-11 11 views
11

¿Hay alguna diferencia entre los siguientes dos índices?Diferencia entre 2 índices con columnas definidas en orden inverso

  • IDX_IndexTables_1
  • IDX_IndexTables_2

Si los hay, ¿cuáles son las diferencias?

create table IndexTables (
    id int identity(1, 1) primary key, 
    val1 nvarchar(100), 
    val2 nvarchar(100), 
) 

create index IDX_IndexTables_1 on IndexTables (val1, val2) 
GO 

create index IDX_IndexTables_2 on IndexTables (val2, val1) 
GO 

Respuesta

16

Sí. Hay una diferencia.

El índice compuesto IDX_IndexTables_1 se puede usar para cualquier consulta en la que se utilice la columna val1 en la cláusula where.

El índice compuesto IDX_IndexTables_2 se puede usar para cualquier consulta en la que se utilice la columna val2 en la cláusula where.

Así, por ejemplo IDX_IndexTables_2 no puede ser utilizado para esta consulta (pero IDX_IndexTables_1 se puede utilizar):

SELECT val1, val2 FROM IndexTables 
WHERE val1 = some_value 

pero se puede utilizar para esta consulta:

SELECT val1, val2 FROM IndexTables 
WHERE val2 = some_value AND val1 = some_other-value 

La manera de pensar un índice compuesto es pensar en un directorio telefónico en papel; Está indexado por la columna de apellido y luego por la columna de primer nombre: puede buscar por apellido pero no por nombre propio.

+0

Su analogía en un índice compuesto me ayudó a entender la diferencia con mucha facilidad. Gracias, Mitch. – Sung

+0

Muy buena respuesta. +1 – spender

2

Lo que tiene es un índice compuesto. El orden es importante cuando su cláusula WHERE no utiliza todas las columnas en el índice compuesto.

considerar esta consulta:

SELECT val1 
FROM IndexTables 
WHERE val1 = 'MyValue' 

Con el fin de saber lo que podría considerarse el índice leer de izquierda a derecha, las columnas de sus índices compuestos. Si la columna no existe en su consulta antes de leer todas las columnas en su consulta, entonces el índice no será utilizado.

IDX_IndexTables_1 (val1, val2): La lectura de izquierda a derecha val1 existe y es nuestra única columna por lo que este índice sería considerado

IDX_IndexTables_2 (val2, val1): La lectura de izquierda a derecha val2 no lo hace existe en esta consulta por lo que no se utilizará.

4

Un índice de varias columnas no es conceptualmente diferente de tomar todos los campos de columnas y concatenarlos juntos, indexando el resultado como un solo campo.

Dado que los índices son b-trees, siempre se buscan de izquierda a derecha. Debe comenzar su búsqueda desde la izquierda para emparejar los resultados mientras se mueve hacia la derecha para que el índice haga su trabajo y brinde resultados útiles.

Con sólo un único campo indexado:

WHERE val1 LIKE 'myvalue%' (uses index) 
WHERE val1 LIKE '%myvalue' (cannot use index) 

Se aplica el mismo concepto para los índices de varias columnas:

Cuando orden es val1, val2

WHERE val1='value1' (uses index) 
WHERE val2='value2' (cannot use index) 

Cuando la orden es val2 , val1

WHERE val1='value1' (cannot use index) 
WHERE val2='value2' (uses index) 

Si ambos campos coinciden, el orden exacto de los índices no importa en ese caso.

WHERE val1='value1' AND val2='value2' (uses index in any order) 
2

Las respuestas anteriores describen cómo usar la primera columna de cada índice. (en la cláusula where)

Creo que también es importante señalar que la segunda columna es útil porque potencialmente aumenta el rendimiento de las consultas que involucran la segunda columna.

La siguiente consulta se completará SOLO con una búsqueda de índice en IDX_1, guardando búsquedas valiosas en la tabla base (ya que val2 ya es parte del índice).

SELECT val2 from IndexTables where val1 = @someVal1 

Del mismo modo, el índice invertido optimizará esta consulta:

SELECT val1 from IndexTables where val2 = @someVal2 

Sin embargo, sólo uno (no importa cuál) de los dos índices se necesite optimizar la siguiente consulta:

SELECT val1, val2 from IndexTables where val1 = @someVal1 and val2 = @someVal2 

Esto muestra que, dependiendo de las consultas que reciba su tabla, puede haber una razón legítima para tener ambos índices.

+0

Tenga en cuenta que si el índice no es único, entonces un compuesto puede ser más selectivo que el otro, dependiendo de la distribución. Pero eso probablemente sea micro-optimizador ... –

+0

Buen punto Mike. A escalas más grandes, esto puede no ser una optimización "micro" en absoluto. –

1

Otras personas han respondido que son diferentes, y estoy de acuerdo.

voy a añadir algunos otros pensamientos aunque ...

  • la (col1, col2) índice significa que no es necesario un índice en col1 sola
  • el (col2, col1) medios de índice que no es necesario un índice en
  • las cuestiones de orden solamente col2 si se trata de cobertura (por ejemplo, cuando en col1, col2 SELECT)
  • la dirección (ASC/DESC) que también importa (Other question 1, Other question 2)
+0

+1 "dirección (ASC/DESC) también importa" ¡Buen punto! Gracias. – Sung

+0

si tiene (col1, col2), ¿no significa que podría simplemente tener (col2) en lugar de (col2, col1)? – Renae

+0

@Renae: tal vez, pero esto es por ejemplo. – gbn

Cuestiones relacionadas