Dit is vooral van belang bij gebruik met samengestelde indexen:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
kan worden gebruikt voor:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
of:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, maar niet voor:
SELECT *
FROM mytable
ORDER BY
col1, col2
Een index op een enkele kolom kan efficiënt worden gebruikt om op beide manieren te sorteren.
Zie het artikel in mijn blog voor details:
- Aflopende indexen
Bijwerken:
Dit kan zelfs van belang zijn voor een index met één kolom, hoewel het niet zo duidelijk is.
Stel je een index voor op een kolom van een geclusterde tabel:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
De index op col1
bewaart geordende waarden van col1
samen met de verwijzingen naar rijen.
Omdat de tabel geclusterd is, zijn de verwijzingen naar rijen eigenlijk de waarden van de pk
. Ze zijn ook gerangschikt binnen elke waarde van col1
.
Dit betekent dat de bladen van de index daadwerkelijk zijn geordend op (col1, pk)
, en deze vraag:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
hoeft niet gesorteerd te worden.
Als we de index als volgt maken:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, dan de waarden van col1
worden aflopend gesorteerd, maar de waarden van pk
binnen elke waarde van col1
wordt oplopend gesorteerd.
Dit betekent dat de volgende vraag:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
kan worden bediend door ix_mytable_col1_desc
maar niet door ix_mytable_col1
.
Met andere woorden, de kolommen die een CLUSTERED INDEX
. vormen op een tabel staan altijd de volgkolommen van een andere index in die tabel.