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_2non è 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 locatione datequindi IDX_2può essere utile per aiutarti a risolverle perché IDX_1non è 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 itemda locatione datenon 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.