To je důležité především při použití se složenými indexy:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
lze použít pro:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
nebo:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, ale ne pro:
SELECT *
FROM mytable
ORDER BY
col1, col2
Index na jednom sloupci lze efektivně použít k řazení oběma způsoby.
Podrobnosti najdete v článku na mém blogu:
- Sestupné indexy
Aktualizace:
Ve skutečnosti to může záležet i na indexu jednoho sloupce, i když to není tak zřejmé.
Představte si index ve sloupci seskupené tabulky:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
Index na col1
uchovává uspořádané hodnoty col1
spolu s odkazy na řádky.
Protože je tabulka seskupená, odkazy na řádky jsou ve skutečnosti hodnoty pk
. Jsou také seřazeny v rámci každé hodnoty col1
.
To znamená, že listy indexu jsou ve skutečnosti uspořádány na (col1, pk)
a tento dotaz:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
nepotřebuje žádné třídění.
Pokud vytvoříme index následovně:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, pak hodnoty col1
budou seřazeny sestupně, ale hodnoty pk
v každé hodnotě col1
budou seřazeny vzestupně.
To znamená, že následující dotaz:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
lze obsluhovat pomocí ix_mytable_col1_desc
ale ne pomocí ix_mytable_col1
.
Jinými slovy, sloupce, které tvoří CLUSTERED INDEX
v jakékoli tabulce jsou vždy koncové sloupce jakéhokoli jiného indexu v této tabulce.