Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Indizes - aufsteigend oder absteigend, welchen Unterschied macht das?

Dies ist in erster Linie wichtig, wenn es mit zusammengesetzten Indizes verwendet wird:

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

kann verwendet werden für:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2 DESC

oder:

SELECT  *
FROM    mytable
ORDER BY
        col1 DESC, col2

, aber nicht für:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2

Ein Index für eine einzelne Spalte kann auf beide Arten effizient zum Sortieren verwendet werden.

Einzelheiten finden Sie im Artikel in meinem Blog:

  • Absteigende Indizes

Aktualisierung:

Tatsächlich kann dies sogar für einen einzelnen Spaltenindex von Bedeutung sein, obwohl es nicht so offensichtlich ist.

Stellen Sie sich einen Index für eine Spalte einer gruppierten Tabelle vor:

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

Der Index auf col1 behält geordnete Werte von col1 zusammen mit den Verweisen auf Zeilen.

Da die Tabelle geclustert ist, sind die Verweise auf Zeilen eigentlich die Werte von pk . Sie werden auch innerhalb jedes Werts von col1 geordnet .

Das bedeutet, dass die Blätter des Index tatsächlich auf (col1, pk) geordnet sind , und diese Abfrage:

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk

braucht keine Sortierung.

Wenn wir den Index wie folgt erstellen:

CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)

, dann die Werte von col1 werden absteigend sortiert, aber die Werte von pk innerhalb jedes Werts von col1 werden aufsteigend sortiert.

Das bedeutet, dass die folgende Abfrage:

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

kann von ix_mytable_col1_desc bereitgestellt werden aber nicht von ix_mytable_col1 .

Mit anderen Worten, die Spalten, die einen CLUSTERED INDEX bilden in jeder Tabelle sind immer die abschließenden Spalten eines anderen Index in dieser Tabelle.