La domanda non è "quando dovrebbe essere il PK NC", ma invece si dovrebbe chiedere "qual è la chiave corretta per l'indice cluster"?
E la risposta dipende davvero da come si interrogano i dati . L'indice cluster presenta un vantaggio rispetto a tutti gli altri indici: poiché include sempre tutte le colonne, copre sempre. Pertanto, le query che possono sfruttare l'indice cluster non devono certamente utilizzare le ricerche per soddisfare alcune delle colonne e / o predicati proiettati.
Un altro pezzo del puzzle è come si può usare un indice ? Esistono tre schemi tipici:
- sonde, quando nell'indice viene cercato un singolo valore chiave
- scansioni dell'intervallo, quando viene recuperato un intervallo di valori chiave
- ordina per requisiti, quando un indice può soddisfare un ordine senza richiedere un ordinamento stop-and-go
Pertanto, se si analizza il carico previsto (le query) e si scopre che un gran numero di query utilizzerebbe un determinato indice perché utilizzano un determinato modello di accesso che beneficia di un indice, ha senso proporre tale indice come indice cluster.
Ancora un altro fattore è che la chiave di indice cluster è la chiave di ricerca utilizzata da tutti gli indici non cluster e quindi una chiave di indice cluster ampia crea un effetto a catena e allarga tutti gli indici non cluster e indici ampi significano più pagine, più I / O , più memoria, meno bontà.
Un buon indice cluster è stabile , non cambia durante il ciclo di vita dell'entità, poiché una modifica dei valori della chiave dell'indice cluster indica che la riga deve essere eliminata e reinserita.
E un buon indice cluster cresce in modo non casuale (ogni valore della chiave appena inserito è maggiore del valore precedente) in modo da evitare la divisione delle pagine e la frammentazione (senza fare casini con FILLFACTOR
s).
Quindi, ora che sappiamo cos'è una buona chiave di indice cluster, la chiave primaria (che è una proprietà logica di modellazione dei dati) soddisfa i requisiti? Se sì, allora il PK dovrebbe essere raggruppato. In caso contrario, il PK deve essere non cluster.
Per fare un esempio, considera una tabella dei fatti di vendita. Ogni voce ha un ID che è la chiave primaria. Ma la stragrande maggioranza delle query richiede dati tra una data e un'altra data, quindi la migliore chiave di indice cluster sarebbe la data di vendita , non l' ID . Un altro esempio di avere un indice cluster diverso dalla chiave primaria è una chiave di selettività molto bassa, come una 'categoria' o uno 'stato', una chiave con solo pochissimi valori distinti. Avere una chiave indice cluster con questa chiave a bassa selettività come chiave all'estrema sinistra, ad esempio (state, id)
, spesso ha senso a causa delle scansioni di intervalli che cercano tutte le voci in un particolare "stato".
Un'ultima nota sulla possibilità di una chiave primaria non cluster su un heap (ovvero non esiste alcun indice cluster). Questo può essere uno scenario valido, il motivo tipico è quando le prestazioni dell'inserimento di massa sono critiche, poiché gli heap hanno un throughput di inserimento di massa significativamente migliore rispetto agli indici cluster.