Если вы получаете все строки из таблицы, почему вы думаете, что следует использовать индекс? Полное сканирование таблицы является наиболее эффективным способом возврата всех значений. Это не имеет ничего общего с отсутствующими в индексе значениями NULL, а также с оптимизатором, выбирающим наиболее эффективные способы получения данных.
@A.B.Cade: вполне возможно, что оптимизатор решит использовать индекс, но маловероятно. Допустим, у вас есть таблица с индексированной таблицей с 100 строками, но только с 10 значениями. Если оптимизатор использует индекс, он должен получить 10 строк из индекса, а затем расширить его до 100 строк, тогда как при сканировании полной таблицы он получает все 100 строк с самого начала. Вот пример:
create table test1 (blarg varchar2(10));
create index ak_test1 on test1 (blarg);
insert into test1
select floor(level/10) from dual connect by level<=100;
exec dbms_stats.gather_table_stats('testschema','test1');
exec dbms_stats.gather_index_stats('testschema','ak_test1');
EXPLAIN PLAN FOR
select * from test1;
Моя точка зрения в основном состоит в том, что этот вопрос в значительной степени основан на ошибочной предпосылке: сканирование индекса по сути лучше, чем сканирование полной таблицы. Это не всегда так, как показывает этот сценарий.