Detta har främst betydelse när det används med sammansatta index:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
kan användas för antingen:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
eller:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, men inte för:
SELECT *
FROM mytable
ORDER BY
col1, col2
Ett index på en enda kolumn kan effektivt användas för sortering på båda sätt.
Se artikeln i min blogg för detaljer:
- Fallande index
Uppdatering:
Faktum är att detta kan ha betydelse även för ett enda kolumnindex, även om det inte är så uppenbart.
Föreställ dig ett index på en kolumn i en klustrad tabell:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
Indexet på col1
behåller ordnade värden för col1
tillsammans med referenserna till rader.
Eftersom tabellen är klustrad är referenserna till rader faktiskt värdena för pk
. De är också ordnade inom varje värde för col1
.
Detta betyder att bladen i indexet faktiskt är ordnade på (col1, pk)
, och denna fråga:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
behöver ingen sortering.
Om vi skapar indexet enligt följande:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, sedan värdena för col1
kommer att sorteras fallande, men värdena för pk
inom varje värde för col1
kommer att sorteras stigande.
Det betyder att följande fråga:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
kan betjänas av ix_mytable_col1_desc
men inte av ix_mytable_col1
.
Med andra ord, kolumnerna som utgör ett CLUSTERED INDEX
i vilken tabell som helst finns alltid de avslutande kolumnerna för alla andra index i den tabellen.