Per impostazione predefinita, il PK è cluster e nella maggior parte dei casi, va bene. Tuttavia, quale domanda dovrebbe essere posta:
- il mio PK dovrebbe essere raggruppato?
- quali colonne saranno la chiave migliore per il mio indice cluster?
PK e indice cluster sono 2 cose differenze:
- PK è un vincolo. PK viene utilizzato per identificare in modo univoco le righe, ma non esiste alcuna nozione di memoria. Tuttavia, per impostazione predefinita (in SSMS), viene applicato da un indice cluster univoco se non è ancora presente un indice cluster.
- Gli indici cluster sono un tipo speciale di indice che memorizza i dati delle righe a livello foglia, il che significa che copre sempre. Tutte le colonne, che facciano parte o meno della chiave, sono memorizzate a livello foglia. Non deve essere univoco, nel qual caso viene aggiunto un unificatore (4 byte) alla chiave del cluster.
Ora finiamo con 2 domande:
- Come desidero identificare in modo univoco le righe nella mia tabella (PK)
- Come voglio memorizzarlo a livello foglia di un indice (Clustered Index)
Dipende da come:
- progettate il vostro modello di dati
- richiedi i tuoi dati e scrivi le tue domande
- inserisci o aggiorni i tuoi dati
- ...
Innanzitutto, hai bisogno di un indice cluster? Se si inserisce in blocco, è più efficiente archiviare i dati non ordinati in un HEAP (rispetto ai dati ordinati in un cluster). Utilizza RID (identificatore di riga, 8 byte) per identificare in modo univoco le righe e memorizzarle nelle pagine.
L'indice cluster non dovrebbe essere un valore casuale. I dati a livello foglia saranno memorizzati e ordinati dalla chiave indice. Pertanto dovrebbe crescere continuamente per evitare la frammentazione o la divisione della pagina. Se questo non può essere raggiunto dal PK, è necessario considerare un'altra chiave come candidato raggruppato. L'indice cluster su colonne identy, GUID sequenziali o anche qualcosa di simile alla data di inserimento va bene da un punto di vista sequenziale poiché tutte le righe verranno aggiunte all'ultima pagina foglia. D'altra parte, mentre l'identificatore univoco può essere utile per le esigenze della tua azienda come PK, non dovrebbero essere raggruppati (sono ordinati / generati casualmente).
Se dopo l'analisi di alcuni dati e query, scopri di utilizzare principalmente lo stesso indice per ottenere i tuoi dati prima di eseguire una ricerca chiave nel PK cluster, puoi considerarlo come indice cluster anche se potrebbe non identificare in modo univoco i tuoi dati.
La chiave di indice cluster è composta da tutte le colonne che si desidera indicizzare. Una colonna uniquefier (4 byte) viene aggiunta se non vi è alcun vincolo univoco su di essa (valore incrementale per i duplicati, null altrimenti). Questa chiave di indice verrà quindi memorizzata una volta per ogni riga a livello foglia di tutti gli indici non cluster. Alcuni di essi verranno anche memorizzati più volte a livelli intermedi (ramo) tra la radice e il livello foglia dell'albero indice (albero B). Se la chiave è troppo grande, tutto l'indice non cluster diventerà più grande, richiederà più spazio di archiviazione e più IO, CPU, memoria, ... Se hai un PK su nome + data di nascita + paese, è molto probabile che questa chiave non è un buon candidato. È troppo grande per un indice cluster. L'identificatore univoco che utilizza NEWSEQUENTIALID () non viene in genere considerato come una chiave ristretta (16 byte) sebbene sia sequenziale.
Quindi, una volta capito come identificare in modo univoco le righe nella tabella, puoi aggiungere un PK. Se pensi di non usarlo nella tua query, non crearlo in cluster. Puoi comunque creare un altro indice non cluster se a volte devi interrogarlo. Si noti che il PK creerà automaticamente un indice univoco.
Gli indici non cluster conterranno sempre la chiave cluster. Tuttavia, se le colonne indicizzate (+ colonne chiave) sono coperte, non ci sarà alcuna ricerca chiave nell'indice cluster. Non dimenticare che puoi anche aggiungere Includi e Dove a un indice non cluster. (usalo saggiamente)
L'indice cluster dovrebbe essere unico e il più stretto possibile L'indice cluster non dovrebbe cambiare nel tempo e dovrebbe essere inserito in modo incrementale.
Ora è il momento di scrivere un po 'di SQL che creerà la tabella, indici e vincoli cluster e non cluster.
Tutto ciò è teorico perché non conosciamo il modello di dati e i tipi di dati utilizzati (A e B).