Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Индексите на SQL Server - нарастващи или низходящи, каква разлика има?

Това преди всичко има значение, когато се използва със съставни индекси:

CREATE INDEX ix_index ON mytable (col1, col2 DESC);

може да се използва за едно от двете:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2 DESC

или:

SELECT  *
FROM    mytable
ORDER BY
        col1 DESC, col2

, но не и за:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2

Индекс на една колона може ефективно да се използва за сортиране и по двата начина.

Вижте статията в моя блог за подробности:

  • Низходящи индекси

Актуализация:

Всъщност това може да има значение дори за един индекс на колона, макар че не е толкова очевидно.

Представете си индекс върху колона от клъстерирана таблица:

CREATE TABLE mytable (
       pk INT NOT NULL PRIMARY KEY,
       col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)

Индексът на col1 запазва подредените стойности на col1 заедно с препратките към редове.

Тъй като таблицата е групирана, препратките към редовете всъщност са стойностите на pk . Те също са подредени във всяка стойност на col1 .

Това означава, че листата на индекса всъщност са подредени на (col1, pk) , и тази заявка:

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk

не се нуждае от сортиране.

Ако създадем индекса, както следва:

CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)

, след това стойностите на col1 ще бъдат сортирани низходящо, но стойностите на pk във всяка стойност на col1 ще бъдат сортирани възходящо.

Това означава, че следната заявка:

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk DESC

може да се обслужва от ix_mytable_col1_desc но не и от ix_mytable_col1 .

С други думи, колоните, които съставляват CLUSTERED INDEX във всяка таблица винаги са крайните колони на всеки друг индекс в тази таблица.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Експортирайте таблични данни от един SQL сървър на друг

  2. Получаване на актуализиран ред

  3. Направете обектен DIE в SQL Server

  4. Брой пъти, когато даден знак се появява в низ

  5. SQL JOIN срещу IN производителност?