Ceci est principalement important lorsqu'il est utilisé avec des index composites:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
peut être utilisé pour:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
ou:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, mais pas pour:
SELECT *
FROM mytable
ORDER BY
col1, col2
Un index sur une seule colonne peut être utilisé efficacement pour le tri dans les deux sens.
Voir l'article de mon blog pour plus de détails:
Mettre à jour:
En fait, cela peut avoir de l'importance même pour un seul index de colonne, même si ce n'est pas si évident.
Imaginez un index sur une colonne d'une table en cluster:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
L'index sur col1conserve les valeurs ordonnées de col1avec les références aux lignes.
Étant donné que la table est groupée, les références aux lignes sont en fait les valeurs du pk. Ils sont également classés dans chaque valeur de col1.
Cela signifie que les feuilles de l'index sont effectivement ordonnées sur (col1, pk), et cette requête:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
n'a pas besoin de tri.
Si nous créons l'index comme suit:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, alors les valeurs de col1seront triées par ordre décroissant, mais les valeurs de pkdans chaque valeur de col1seront triées par ordre croissant.
Cela signifie que la requête suivante:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
peut être servi ix_mytable_col1_descmais pas par ix_mytable_col1.
En d'autres termes, les colonnes qui constituent un CLUSTERED INDEXsur n'importe quelle table sont toujours les colonnes de fin de tout autre index de cette table.