Индекс для столбца с нулевым значением

У меня есть индекс в столбце с нулевым значением, и я хочу выбрать все его значения следующим образом:

SELECT e.ename FROM emp e; 

В плане объяснения я вижу FULL TABLE SCAN (даже подсказка не помогла)

 SELECT e.ename FROM emp e WHERE e.ename = 'gdoron'; 

Использует индекс …

Я googled и узнал, что в индексах нет нулевых записей, поэтому первый запрос не может использовать индекс.

Мой вопрос прост: почему в индексах нет нулевых записей?

По умолчанию реляционные базы данных игнорируют значения NULL (поскольку реляционная модель говорит, что NULL означает «нет»). Таким образом, индекс не сохраняет значение NULL, следовательно, если у вас есть нулевое условие в инструкции SQL, связанный индекс игнорируется (по умолчанию).

Но вы можете устранить эту проблему, проверьте ЭТУ или ЭТУ статью.

Если вы получаете все строки из таблицы, почему вы думаете, что он должен использовать индекс? Полное сканирование таблицы является наиболее эффективным средством для возврата всех значений. Он не имеет ничего общего с нулями, которые не находятся в индексе, и все, что связано с оптимизатором, выбирающим наиболее эффективные способы извлечения данных.


@ABCade: Возможно, оптимизатор может использовать индекс, но вряд ли. Допустим, у вас есть таблица с индексированной таблицей со 100 строками, но всего 10 значений. Если оптимизатор использует индекс, он должен получить 10 строк из индекса, а затем развернуть его до 100 строк, тогда как при сканировании по полному столу он получает все 100 строк из get-go. Вот пример:

 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; 

Моя точка зрения в основном состоит в том, что этот вопрос в основном основан на ошибочной предпосылке: индексированные сканирование по своей сути лучше, чем сканирование полного стола. Это не всегда так, как демонстрирует этот сценарий.

Я не уверен, что первый запрос имеет отношение к использованию индекса, по крайней мере, второй.

В любом случае, хотя верно, что вы не можете индексировать столбец, содержащий нулевое значение, есть способы сделать это, например, например:

 create index MY_INDEX on emp(ename, 1); 

обратите внимание , 1) в конце, что делает трюк.