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.