Так, користь приходить, коли ви хочете запитувати частину індексу. Якщо ви поставите спочатку використані предикати предикати, індекс можна використовувати для запитів, які включають ці предикати, але не для всіх стовпців індексу.
Крім того, якщо у вас немає інших вимог, це може допомогти викласти найвибірковіші предикати, оскільки це може скоротити операції пошуку індексу швидше.
У вашому випадку IDX_2
це не обов'язково зайве, залежно від характеру запитів у таблиці. Однак, можливо, не потрібно буде включати всі стовпці. Якщо, наприклад, ви робите багато запитів location
і date
тоді, IDX_2
можливо, буде корисно вирішити ці запити, оскільки IDX_1
це не в правильному порядку, щоб бути корисним для цього. Однак, можливо, ви вважаєте item
це зайвим IDX_2
.
Починаючи з 9i, Oracle представив оператор "пропустити сканування" , за допомогою якого ефективніші запити стовпчиків індексів можна запитувати, що може зменшити потребу в додаткових індексах такого роду.
У більш конкретному випадку, якщо ви запитуєте item
на location
і date
і не потрібні ніякі інші стовпці , то запит може бути повністю вирішена , хоча індекс без нічого з таблиці читати. Ви також можете створити індекси, що охоплюють, із доданими неіндексованими стовпцями. Якщо всі необхідні стовпці можна вирішити з індексу покриття, запит взагалі не повинен торкатися головної таблиці.
Нарешті, відповідаючи на ваше останнє запитання: Якщо у вас є набір регулярно використовуваних запитів, які використовують багато ресурсів і які можна налаштувати за допомогою індексу, це, безумовно, варто задуматися. Однак, підтримка індексів має накладні витрати на вставки, тому вам доведеться відміняти ефективність запитів проти накладних витрат, які індекси розміщують під час операцій із вставкою чи оновленням.