Bene, la prima domanda è facile:
Quando dovrebbe essere utilizzato un indice cluster?
Sempre. Periodo. Tranne pochissimi, rari casi limite. Un indice cluster rende una tabella più veloce, per ogni operazione. SÌ! Lo fa. Guarda l'eccellente The Clustered Index Debate continues di Kim Tripp per informazioni di base.Si cita anche i suoi criteri principali per un indice cluster:
- stretta
- statica (non cambia mai)
- unica
- se mai possibile: sempre crescente
INT IDENTITY soddisfa questo perfettamente - I GUID non lo fanno. Vedi GUID's as Primary Key per informazioni di approfondimento.
Perché stretto? Poiché la chiave di clustering viene aggiunta a ogni singola pagina di indice di ciascun indice non cluster sulla stessa tabella (per poter effettivamente cercare la riga di dati, se necessario). Non si desidera avere VARCHAR (200) nella chiave di clustering ....
Perché unico ?? Vedere sopra: la chiave di clustering è l'elemento e il meccanismo utilizzati da SQL Server per trovare in modo univoco una riga di dati. Deve essere unico. Se si seleziona una chiave di clustering non univoca, SQL Server stesso aggiungerà un unificatore di 4 byte alle chiavi. Stai attento a questo!
Avanti: indici non raggruppati. Fondamentalmente c'è una regola: qualsiasi chiave estranea in una tabella figlia che faccia riferimento a un'altra tabella deve essere indicizzata, accelererà i JOIN e altre operazioni.
Inoltre, tutte le query che hanno clausole WHERE sono un buon candidato - scegli quelle che sono state eseguite molto. Metti indici su colonne che appaiono nelle clausole WHERE, nelle istruzioni ORDER BY.
Successivo: misurare il sistema, controllare le DMV (viste di gestione dinamica) per suggerimenti sugli indici non utilizzati o mancanti e modificare il sistema più e più volte. È un processo continuo, non lo farai mai! Vedere here for info su questi due DMV (indici mancanti e non utilizzati).
Un'altra parola di avvertimento: con un carico di indici, è possibile rendere qualsiasi query SELECT molto veloce. Ma allo stesso tempo, potrebbero esserci INSERT, UPDATE e DELETE che devono aggiornare tutti gli indici coinvolti. Se solo mai SELEZIONA - impazzisci! Altrimenti, è un delicato e delicato equilibrio. Puoi sempre modificare una singola query oltre ogni aspettativa, ma il resto del tuo sistema potrebbe risentirne. Non over-index il tuo database! Metti in campo alcuni buoni indici, controlla e osserva come si comporta il sistema, quindi aggiungine un altro o due, e ancora: osserva come viene influenzata la prestazione totale del sistema.
"Va bene avere un indice su un varchar o datetime?" Ho una tabella in cui l'indice cluster è su un datetime (anche se stiamo usando solo la parte data) poiché tutte le query sulla tabella sono limitate a una coppia di date di inizio/fine e la selettività dei dati è abbastanza alta da rendere è una buona scelta. – Tony