Часто возникает ситуация, когда хотелось бы восспользоваться индексом на поле , которое зачастую IS NULL, но часто выполняются запросы типа

SELECT * FROM client
WHERE d_close IS NULL

Обычный индекс на это поле в этом случае не работает, так как пустые поля в индекс не вставляются.

Но обходной путь всё же есть :) . Если сделать индекс составной, на первом месте нужное нам поле, а на втором - всегда заведомо непустое поле, лучше (но необязательно) уникальное.

CREATE UNIQUE INDEX  CLIENT#D_CLOSE#ID_CLIENT 
       ON CLIENT (D_CLOSE, ID_CLIENT);

Такие индексы Oracle (особенно 7-й) не очень любит применять самостоятельно, но если ему нежно подсказать...

SELECT /*+ INDEX (client CLIENT#D_CLOSE#ID_CLIENT ) */ * FROM client
WHERE d_close IS NULL

то индекс воспринимается и всё отлично и быстро работает (особенно если пустых полей немного для неуникального индекса - тогда избирательность индекса повышается).

Хостинг от uCoz