Единственный индекс, который является возможным кандидатом для использования в вашем запросе, - это N_VRFTN_IDX2, поскольку он индексирует четыре столбца, которые вы используете в предложении WHERE: HEAD, MBR, DOB и LNAME.
Однако, поскольку вы применяете функции как для DOB, так и для LNAME, они не могут рассматриваться. Затем оптимизатор может решить не использовать этот индекс, поскольку он считает, что HEAD + MBR сами по себе являются недостаточно избирательной комбинацией. Если вы удалили вызов TO_CHAR () из DOB, у вас есть три ведущих столбца в N_VRFTN_IDX2, которые могут сделать его более привлекательным для оптимизатора. Точно так же необходимо TRIM () LNAME?
Другое дело, что поиск SYSTEM_CODE означает, что запрос должен считываться из таблицы (поскольку этот столбец не проиндексирован). Если N_VRFTN_IDX2 имеет плохой кластеризационный фактор, оптимизатор может принять решение выполнить FULL TABLE SCAN, потому что индексированные чтения являются накладными расходами. Принимая во внимание, что если бы вы добавили SYSTEM_CODE в индекс, весь запрос мог бы быть удовлетворен с помощью INDEX RANGE SCAN, что было бы намного быстрее.
Наконец, насколько свежа ваша статистика? Если ваша статистика устарела, это может привести к тому, что оптимизатор примет глупое решение. Например, более точная статистика может привести к тому, что оптимизатор будет использовать составной индекс даже с двумя ведущими столбцами.