Oracle пытается вернуть набор результатов с наименьшим количеством требуемого ввода-вывода (обычно это имеет смысл, потому что ввод-вывод медленный). Индексы принимают не менее 2 вызовов ввода / вывода. один для индекса и один для таблицы. Обычно больше, в зависимости от размера индекса и размеров таблиц и количества возвращаемых записей, где они находятся в файле данных, ...
Вот где приходит статистика. Предположим, ваш запрос вернет 10 записей. Оптимизатор может рассчитать, что при использовании индекса потребуется 10 вызовов ввода / вывода. Допустим, ваша таблица, согласно статистике, находится в 6 блоках в файле данных. Oracle быстрее выполнит полное сканирование (6 операций ввода-вывода), затем прочитает индекс, прочитает таблицу, прочитает, затем индекс для следующего соответствующего ключа, прочитает таблицу и т. Д.
Так что в вашем случае таблица может быть очень маленькой. Статистика может быть отключена.
Я использую следующее, чтобы собрать статистику и настроить ее для своих точных нужд:
begin
DBMS_STATS.GATHER_TABLE_STATS(ownname
=> '&owner' ,tabname => '&table_name', estimate_percent => dbms_stats.AUTO_SAMPLE_SIZE,granularity
=> 'ALL', cascade => TRUE);
-- DBMS_STATS.GATHER_TABLE_STATS(ownname
=> '&owner' ,tabname => '&table_name',partname => '&partion_name',granularity => 'PARTITION', estimate_percent => dbms_stats.AUTO_SAMPLE_SIZE, cascade
=> TRUE);
-- DBMS_STATS.GATHER_TABLE_STATS(ownname
=> '&owner' ,tabname => '&table_name',partname => '&partion_name',granularity => 'PARTITION', estimate_percent => dbms_stats.AUTO_SAMPLE_SIZE, cascade
=> TRUE,method_opt => 'for all indexed columns size 254');
end;