sql >> Base de Datos >  >> RDS >> Sqlserver

Índices de SQL Server:ascendente o descendente, ¿qué diferencia hace?

Esto importa principalmente cuando se usa con índices compuestos:

CREATE INDEX ix_index ON mytable (col1, col2 DESC);

se puede usar para:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2 DESC

o:

SELECT  *
FROM    mytable
ORDER BY
        col1 DESC, col2

, pero no para:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2

Un índice en una sola columna se puede usar de manera eficiente para ordenar en ambos sentidos.

Vea el artículo en mi blog para más detalles:

  • Índices descendentes

Actualización:

De hecho, esto puede ser importante incluso para un índice de una sola columna, aunque no es tan obvio.

Imagine un índice en una columna de una tabla agrupada:

CREATE TABLE mytable (
       pk INT NOT NULL PRIMARY KEY,
       col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)

El índice en col1 mantiene los valores ordenados de col1 junto con las referencias a las filas.

Dado que la tabla está agrupada, las referencias a las filas son en realidad los valores del pk . También se ordenan dentro de cada valor de col1 .

Esto significa que las hojas del índice en realidad están ordenadas en (col1, pk) , y esta consulta:

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk

no necesita clasificación.

Si creamos el índice de la siguiente manera:

CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)

, luego los valores de col1 se ordenarán de forma descendente, pero los valores de pk dentro de cada valor de col1 se ordenará de forma ascendente.

Esto significa que la siguiente consulta:

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk DESC

puede ser servido por ix_mytable_col1_desc pero no por ix_mytable_col1 .

En otras palabras, las columnas que constituyen un CLUSTERED INDEX en cualquier tabla siempre están las columnas finales de cualquier otro índice en esa tabla.