Если я правильно помню, Oracle не индексирует значения NULL;таким образом, если все поля, которые входят в индекс, равны NULL, в этой строке не будет записи индекса.Так, например, если у вас есть таблица типа
ID NUMBER PRIMARY KEY
FIELD1 NUMBER
FIELD2 NUMBER
с индексами
ID_INDEX (ID) PRIMARY KEY
FIELD1_INDEX (FIELD1)
FIELD2_INDEX (FIELD2)
и данными
ID=1 FIELD1=NULL FIELD2=1
ID=2 FIELD1=2 FIELD2=NULL
ID=3 FIELD1=3 FIELD2=3
ID=4 FIELD1=NULL FIELD2=NULL
, в ней должно быть четыре записиID_INDEX, но только два в FIELD1_INDEX и FIELD2_INDEX.В этом можно убедиться, запросив представление DBA_IND_STATISTICS (после сбора статистики таблицы):
SELECT * FROM DBA_IND_STATISTICS WHERE TABLE_NAME = 'whatever';
и просмотрев столбцы DISTINCT KEYS и NUM_ROWS.
Вывод из всего этого заключается в том, чтоЕсли у вас есть запрос, который ищет значения NULL в определенном столбце, есть большая вероятность, что вы закончите полное сканирование таблицы.Я полагаю, что кластерный индекс может фактически индексировать записи, имеющие значение NULL, но я не использовал их, поэтому не уверен в этом.
Надеюсь, это поможет.