2010-02-09 12 views
6

dire che ho ottenuto un tavolo:SQL Server utilizzerà un indice composto quando solo una singola colonna si trova nella clausola WHERE?

CREATE TABLE Users (
    Id INT IDENTITY (1, 1), 
    FirstName VARCHAR(40), 
    LastName VARCHAR(40) 
) 

Le query sono di solito su FirstName o Cognome, ma anche su FirstNameeCognome.

Se creo un indice non cluster in FirstName e un altro sulla Cognome, poi i miei primi due query sono soddisfatti. Apparentemente, SQL Server utilizzerà index intersection per l'altra query.

In alternativa, se ho indexees su (FirstName) e su (Cognome, Nome), può/non SQL Server utilizzare il secondo indice per le query su un solo Cognome così come query su entrambi?

SQL Server memorizza le parti dell'indice composto da sinistra a destra o da destra a sinistra? In altre parole: costruirà la chiave come LastNameFirstName o FirstNameLastName? O è libero di sceglierne uno arbitrariamente?

risposta

5

can/does SQL Server utilizza l'indice (Cognome, Nome) per le query solo su LastName e le query su entrambi?

Sì, il database verrà utilizzare l'indice (Cognome, Nome) per le query su Cognome. Sarà non usare questo indice per le query solo su FirstName.

Fa parti si negozio indice composto da sinistra a destra o da destra a sinistra?

L'archivio è in un B-Tree. Se lo si ritiene memorizzato da destra a sinistra o da sinistra a destra è solo un utile ausilio di visualizzazione e non è correlato all'effettiva memorizzazione dei dati.

+0

Intendo: quando si costruisce la chiave per inserire l'albero B, è la chiave per un indice composto (A, B, C) memorizzato come (A, B, C) o (C, B, A), o dipende da SQL Server sceglierne uno arbitrariamente? –

+2

Penso che quello che intende sia come viene costruita la chiave. L'anversa è da sinistra a destra, esattamente come si definisce la chiave. Ed è per questo che non può essere utilizzato per cercare il cognome. –

1

Sì, se si esegue una query su LastName da solo, è necessario utilizzare l'indice (LastName, FirstName). Quindi sarebbe usato sia quando si esegue una query da LastName da solo, sia da LastName e FirstName insieme.

Le linee guida generali assicurano che la colonna con la maggiore selettività appaia per prima nell'indice composto in quanto fornisce il massimo vantaggio/restringe il gruppo di risultati prima delle seguenti colonne meno selettive.

1

A seconda della query effettiva che si sta inviando, è possibile utilizzare un indice composito su due colonne anche se si esegue solo la ricerca della seconda colonna. Tuttavia, non otterrai una ricerca per indice, ma molto probabilmente una scansione indice. Se questo è "abbastanza buono" per te, dipende dal tuo ambiente specifico. L'indicizzazione è più un'arte che una scienza e molti fattori diversi influenzano la tua decisione su come indicizzare un tavolo. È sempre un compromesso avere troppi indici su un tavolo è tanto male quanto avere troppi pochi. Assicurati che le tue domande più cruciali siano coperte bene e poi decidi caso per caso se ogni indice aggiuntivo vale il suo costo.

Inoltre, poiché non è stato ancora menzionato e fornito almeno su SQL Server 2005: consente di inserire la clausola INCLUDE per gli indici non cluster. È un'aggiunta trascurata, ma davvero utile a qualsiasi strategia di indicizzazione.

+0

+1 per menzionare index-scan vs index-seek; anche INCLUDE. –

Problemi correlati