Если у вас есть таблица EMP
со столбцом HIREDATE
, и этот столбец проиндексирован, то оптимизатор может выбрать использование индекса для доступа к таблице в запросе с условием, подобным
... HIREDATE >= ADD_MONTHS(SYSDATE, -12)
чтобы найти сотрудников, нанятых за последние 12 месяцев.
Однако, HIREDATE
должен быть один с левой стороны. Если вы добавляете или вычитаете месяцы или дни или если вы заключаете это в вызов функции, такой как ADD_MONTHS
, индекс не может быть использован. Оптимизатор не будет выполнять тривиальных арифметических манипуляций для преобразования условия в условие, при котором HIREDATE
само по себе должно удовлетворять неравенству.
То же самое произошло в вашем втором запросе. Если вы измените условие на
... length(i.code) > length(ii.code)
тогда оптимизатор может использовать индекс на основе функции для length(code)
. Но даже в вашем первом запросе, если вы измените условие на
... length(code) - 5 > 0
индекс НЕ будет использоваться, потому что это не условие неравенства для length(code)
. Опять же, оптимизатор не достаточно умен, чтобы выполнять тривиальные алгебраические манипуляции, чтобы переписать это в форме, где это условие неравенства для length(code)
.