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.