In qualche modo conosco già la risposta a questa domanda, ma ho sempre la sensazione che ci sia qualcosa di più che devo imparare sull'argomento.
La mia comprensione di base è che in generale, un singolo indice che include solo tutti i campi su cui potresti eseguire query / ordinamento in un dato momento non è probabilmente utile, ma ho visto questo tipo di cose. Come in, qualcuno ha pensato: "Beh, se mettiamo tutte queste cose in un indice, il database può usarlo per trovare ciò di cui ha bisogno", senza aver mai visto un piano di esecuzione per alcune delle query effettive in esecuzione.
Immagina un tavolo come questo:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Potrei vedere un unico indice compresi i name
, customerId
e dateCreated
campi.
Ma la mia comprensione è che un tale indice non verrebbe utilizzato in una query come, ad esempio:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
Per una domanda del genere, mi sembra che un'idea migliore sarebbe un indice che includa i campi customerId
e dateCreated
, con il customerId
campo "primo". Ciò creerebbe un indice che dovrebbe organizzare i dati in modo tale che questa query possa trovare rapidamente ciò di cui ha bisogno, nell'ordine in cui è necessaria.
Un'altra cosa che vedo, forse con la stessa frequenza della prima, sono i singoli indici su ciascun campo; così, uno ciascuno su name
, customerId
e dateCreated
campi.
A differenza del primo esempio, questo tipo di arrangiamento mi sembra a volte almeno parzialmente utile; il piano di esecuzione della query potrebbe mostrare che almeno sta usando l'indice su customerId
per selezionare i record, ma non sta usando l'indice con il dateCreated
campo per ordinarli.
So che questa è una domanda ampia, perché la risposta specifica a una particolare query su un particolare set di tabelle è in genere quella di vedere cosa dice il piano di esecuzione e altrimenti prendere le specifiche delle tabelle e delle query in account. Inoltre, so che dipende dalla frequenza con cui una query potrebbe essere eseguita rispetto al sovraccarico di mantenere un determinato indice per esso.
Ma suppongo che ciò che sto chiedendo sia come un "punto di partenza" generale per gli indici, ha senso l'idea di avere indici specifici per query specifiche, frequentemente estratte e i campi nelle clausole WHERE o ORDER BY?