Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Indici di SQL Server:crescente o decrescente, che differenza fa?

Ciò è importante soprattutto se utilizzato con indici compositi:

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

può essere utilizzato per:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2 DESC

oppure:

SELECT  *
FROM    mytable
ORDER BY
        col1 DESC, col2

, ma non per:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2

Un indice su una singola colonna può essere utilizzato in modo efficiente per l'ordinamento in entrambi i modi.

Vedi l'articolo nel mio blog per i dettagli:

  • Indici decrescenti

Aggiornamento:

In effetti, questo può essere importante anche per un singolo indice di colonna, anche se non è così ovvio.

Immagina un indice su una colonna di una tabella raggruppata:

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

L'indice su col1 mantiene i valori ordinati di col1 insieme ai riferimenti alle righe.

Poiché la tabella è raggruppata, i riferimenti alle righe sono in realtà i valori del pk . Sono anche ordinati all'interno di ogni valore di col1 .

Ciò significa che le foglie dell'indice sono effettivamente ordinate su (col1, pk) , e questa query:

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk

non ha bisogno di smistamento.

Se creiamo l'indice come segue:

CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)

, quindi i valori di col1 sarà ordinato decrescente, ma i valori di pk all'interno di ogni valore di col1 sarà ordinato crescente.

Ciò significa che la seguente query:

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

può essere servito da ix_mytable_col1_desc ma non da ix_mytable_col1 .

In altre parole, le colonne che costituiscono un CLUSTERED INDEX su qualsiasi tabella ci sono sempre le colonne finali di qualsiasi altro indice su quella tabella.