sql >> Databáze >  >> RDS >> Sqlserver

Indexy SQL Server – vzestupné nebo sestupné, jaký je v tom rozdíl?

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.



  1. Předávání více hodnot v jednom parametru

  2. Příkaz PRINT v T-SQL

  3. MySQL DELETE FROM s poddotazem jako podmínkou

  4. SQLite VACUUM