Это, вероятно, не "ошибка" в обычном смысле этого слова.Это просто случай, когда оптимизатор не выбирает правильный путь.
Учтите, что c
действительно большой, а a
действительно маленький, и у вас есть индекс, где первый столбец равен * 1005.*.
Первый запрос пытается использовать этот индекс.Но скажем, таблица c
действительно большая и col1
распространяется по всем страницам данных.Итак, все данные должны быть прочитаны, но вы делаете это через индекс, который замедляет процесс.Если таблица больше доступной памяти, вы можете получить сбои.
Второй запрос не может использовать этот индекс.Таким образом, он находит другой путь выполнения.Он решает, что чтение a
- лучший путь.a
мало, а другие таблицы вносят небольшой вклад.Он может перейти непосредственно к соответствующим строкам в c
- и затем применить условия фильтрации.
По различным причинам, основанным на оценках размеров, Oracle может подумать, что первый подход превосходит второй, даже когда онне является.Оптимизация трудна.
Вышеприведенное предназначено только для предоставления одного сценария, пытающегося объяснить, почему происходит нечто подобное.Оптимизатор в целом работает хорошо, но всегда есть возможности для улучшения.