Oracle в индексах на основе B*-дерева не содержит неопределенных ключей. То есть если в таблице есть запись у которой по всем ключам индекса стоит NULL, то индекс соответствующей записи не имеет.
Хорошо это или плохо?
Приведу пример того, что это хорошо.
Создаем таблицу. Одна колонка в таблице имеет значение NULL или любое другое. По этой колонке построим индекс. Очевидно, что если в таблице будет много записей с пустым значение ключа нашего индекса, то индекс будет небольшим. А значит, получить записи с непустым значением ключа будет легко и просто.
Смотрим сюда:
create table my_table (a number, b varchar2 (50)); create index my_table_index on my_table (a); insert into my_table select OBJECT_ID,object_name from dba_objects ; insert into my_table select null,object_name from dba_objects; commit; analyze index my_table_index compute statistics; SQL Statement from editor: select /*+index(my_table) */ * from my_table where a is not null ------------------------------------------------------------ Statement Id=0 Type=SELECT STATEMENT Cost=290 TimeStamp=21-07-10::11::24:36 (1) SELECT STATEMENT ALL_ROWS Est. Rows: 57 775 Cost: 290 (3) TABLE TABLE ACCESS BY INDEX ROWID ANALIZ.MY_TABLE [Not Analyzed] (3) Est. Rows: 57 775 Cost: 290 Tablespace: ANALIZ (2) INDEX INDEX FULL SCAN ANALIZ.MY_TABLE_INDEX [Analyzed] Est. Rows: 5 860 Cost: 237
Такое свойство индекса можно использовать следующим образом: есть таблица с «обработанными» записями и еще «необработанными». «Необработанные» записи в ключе индекса имеют непустое значение. После «обработки» ключ делаем пустым. Таким образом, когда выбираются записи для «обработки» используется индекс, состоящий только из записей с непустым ключом.
Возможно, вы еще как-то применяете такое свойство индекса?