E così entra nell'arte del tuning delle performance e delle strategie di indicizzazione ...
Mi sembra logico modificare la definizione dell'indice esistente per includere le colonne suggerite
Prenderò il tuo preventivo e scriverò una terza definizione di indice:
create index [idx_index3]
on [table1] (col1, col2, col3)
include (col4, col5, col6....);
Questa dovrebbe essere la CREATE INDEX
dichiarazione che corrisponde alla tua dichiarazione citata.
Potrebbe benissimo essere una soluzione prudente, ma dipende . Ecco un paio di esempi quando dico che dipende.
Se hai un carico di lavoro comune che consiste principalmente di query come questa:
select col1, col2, col3
from table1
where col1 = 1
and col2 = 2
and col3 = 3;
Quindi il tuo idx_index1
indice sarebbe solido. Perfettamente stretto, è un indice che soddisfa quella query senza dati estranei al suo interno (non tenendo conto della definizione dell'indice cluster, se del caso).
Ma se hai un carico di lavoro che consiste in query principalmente come le seguenti:
select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2;
Quindi idx_index2
sarebbe saggio, in quanto è quello che viene chiamato un indice di copertura che impedisce la necessità di una chiave di ricerca all'indice cluster (o di una ricerca RID all'heap). Tale definizione di indice non cluster includerebbe esclusivamente tutti i dati richiesti dalla query.
Con la tua raccomandazione, sarebbe adatto per una query come la seguente:
select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2
and col3 = 3;
La tua idx_index3
raccomandazione sarebbe un indice di copertura che soddisfi i criteri di ricerca per la query sopra.
Il punto su cui sto cercando di arrivare è in una domanda isolata come questa a cui non possiamo rispondere in modo definitivo. Tutto dipende da quale sia il carico di lavoro comune e frequente. Ovviamente puoi sempre definire tutti e tre questi indici per gestire ogni tipo di query di esempio, ma poi viene messo in discussione la manutenzione che sarà richiesta per mantenere aggiornati questi indici (pensa: INSERTI, AGGIORNAMENTI, ELIMINA). Questo è il sovraccarico degli indici.
È necessario analizzare e valutare il carico di lavoro e determinare dove saranno i vantaggi migliori. Se la prima query di esempio è la più comune di gran lunga eseguita dozzine di volte al secondo e c'è una query molto rara come la terza query di esempio, non avrebbe senso gonfiare le pagine a livello di foglia dell'indice con il INCLUDE
colonne non chiave. Tutto dipende dal carico di lavoro.
Se capisci le strategie di indicizzazione prudente e comprendi il tuo carico di lavoro comune, applicando entrambi, sarai in grado di trovare qual è la strada migliore da prendere.