Questa discussione si sta lasciando sfuggire il punto importante: La questione non è se il "non-chiave colonne" sono meglio di includere come indice-colonne o come incluso-colonne.
La domanda è quanto è costoso utilizzare il meccanismo di inclusione per includere colonne che sono non realmente necessarie nell'indice? (in genere non fa parte delle clausole where, ma spesso incluse in select). Così il vostro dilemma è sempre:
- Usa indice su ID1, ID2 ... idN solo o
- Usa indice su ID1, ID2 ... idN più includere col1, col2 ... Coln
Dove: ID1, ID2 ... idN sono colonne, spesso utilizzate in restrizioni e col1, col2 ... Cöln sono colonne spesso selezionati, ma in genere non utilizzato in restrizioni
(L'opzione per includere tutte queste colonne come parte della chiave dell'indice è sempre semplicemente sciocca (a meno che non vengano utilizzate anche nelle restrizioni) - perché sarebbe sempre più costosa da mantenere poiché l'indice deve essere aggiornato e ordinato anche quando i "tasti" non sono cambiati).
Quindi utilizzare l'opzione 1 o 2?
Risposta: Se la tabella è raramente aggiornato - per lo più inserita/cancellato dal - allora è relativamente poco costoso per usare il include-meccanismo per includere alcune "colonne caldi" (che sono spesso utilizzati in seleziona - ma non spesso usato su restrizioni) poiché gli inserimenti/eliminazioni richiedono che l'indice sia aggiornato/ordinato in ogni caso e quindi poco overhead aggiuntivo è associato all'archiviazione di alcune colonne aggiuntive mentre già aggiorna l'indice. L'overhead è la memoria aggiuntiva e la CPU utilizzata per memorizzare informazioni ridondanti sull'indice.
Se le colonne si considera da aggiungere come inclusi colonne sono spesso aggiornati (senza le index chiave-colonne in fase di aggiornamento) - o - se è così molti di loro che l'indice si avvicina a un copia del tuo tavolo - usa l'opzione 1 che suggerirei! Inoltre, se aggiungendo determinate colonne-colonna si scopre di non fare alcuna differenza in termini di prestazioni, potresti saltare l'idea di aggiungerle :) Verifica che siano utili!
Il numero medio di righe per gli stessi valori nelle chiavi (id1, id2 ... idN) può essere di una certa importanza.
Si noti che se una colonna - che si aggiunge come un incluso -column dell'indice - è utilizzato nel restrizione: Finché l'indice in quanto tale, può essere utilizzato (sulla base di restrizione contro Index chiave -columns), quindi SQL Server corrisponde alla restrizione di colonna rispetto all'indice (valori del nodo foglia) anziché utilizzare il metodo costoso attorno alla tabella stessa.
fonte
2015-06-13 17:27:17
Quindi, questa sarebbe una tecnica per creare una versione meno costosa di un indice coperto? – JMarsch
@gbn, ti dispiacerebbe spiegare questa frase in modo più dettagliato e spiegare perché significa che la clausola include non è utile per l'ordinamento, ecc. "La clausola INCLUDE aggiunge i dati al livello più basso/foglia, piuttosto che nell'indice albero. Questo rende l'indice più piccolo perché non fa parte dell'albero " –
@ JMarsch: scusa per la risposta in ritardo, ma sì, questo è esattamente quello che è. – gbn