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.