Sì, il vantaggio arriva quando si desidera eseguire una query su una parte dell'indice. Se si inseriscono prima i predicati usati parzialmente, l'indice può essere utilizzato per le query che coinvolgono tali predicati ma non tutte le colonne dell'indice.
Inoltre, a meno che tu non abbia altri requisiti, può aiutare a mettere per primi i predicati più selettivi, in quanto ciò può ridurre le operazioni di ricerca dell'indice più velocemente.
Nel tuo caso IDX_2
non è necessariamente ridondante a seconda della natura delle query sul tavolo. Tuttavia, potrebbe non essere necessario includere tutte le colonne. Se, ad esempio, fai molte query entro location
e date
quindi IDX_2
può essere utile per aiutarti a risolverle perché IDX_1
non è nell'ordine giusto per essere utile per quello. Tuttavia, potresti scoprire che item
è ridondante IDX_2
.
Da 9i, Oracle ha introdotto un operatore 'skip scan' in cui è possibile interrogare in modo più efficiente le colonne dell'indice finale, il che può ridurre la necessità di indici supplementari di questo tipo.
In un caso più specifico, se si esegue una query item
da location
e date
non sono necessarie altre colonne, è possibile risolvere completamente la query tramite l'indice senza dover leggere nulla dalla tabella. Puoi anche creare indici di copertura a cui sono collegate colonne non indicizzate. Se tutte le colonne necessarie possono essere risolte dall'indice di copertura, la query non deve assolutamente toccare la tabella principale.
Infine, in risposta alla tua ultima domanda: se disponi di una serie di query utilizzate regolarmente che utilizzano molte risorse e potrebbero essere ottimizzate utilizzando un indice, vale sicuramente la pena considerare. Tuttavia, la gestione degli indici comporta un sovraccarico sugli inserti, quindi sarà necessario scambiare le prestazioni delle query con il sovraccarico che gli indici collocano nelle operazioni di inserimento o aggiornamento.