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 col1
conserve les valeurs ordonnées de col1
avec 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 col1
seront triées par ordre décroissant, mais les valeurs de pk
dans chaque valeur de col1
seront 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_desc
mais pas par ix_mytable_col1
.
En d'autres termes, les colonnes qui constituent un CLUSTERED INDEX
sur n'importe quelle table sont toujours les colonnes de fin de tout autre index de cette table.