Dette har primært betydning, når det bruges med sammensatte indekser:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
kan bruges til enten:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
eller:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, men ikke til:
SELECT *
FROM mytable
ORDER BY
col1, col2
Et indeks på en enkelt kolonne kan effektivt bruges til sortering på begge måder.
Se artiklen i min blog for detaljer:
- Faldende indekser
Opdatering:
Faktisk kan dette have betydning selv for et enkelt kolonneindeks, selvom det ikke er så indlysende.
Forestil dig et indeks på en kolonne i en klynget tabel:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
Indekset på col1 beholder ordnede værdier for col1 sammen med referencerne til rækker.
Da tabellen er klynget, er referencerne til rækker faktisk værdierne af pk . De er også ordnet inden for hver værdi af col1 .
Det betyder, at blade af indekset faktisk er bestilt på (col1, pk) , og denne forespørgsel:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
behøver ingen sortering.
Hvis vi opretter indekset som følger:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, derefter værdierne af col1 vil blive sorteret faldende, men værdierne for pk inden for hver værdi af col1 vil blive sorteret stigende.
Det betyder, at følgende forespørgsel:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
kan betjenes af ix_mytable_col1_desc men ikke af ix_mytable_col1 .
Med andre ord, de kolonner, der udgør et CLUSTERED INDEX på enhver tabel er altid de efterfølgende kolonner i ethvert andet indeks på den tabel.