Я собираюсь "ответить" на не вопрос выше.
Статьи, на которые вы ссылаетесь, довольно правильные - индексы b-дерева Oracle не будут захватывать, когда конечные узлы равны нулю. Возьмите этот пример:
CREATE TABLE MYTABLE (
ID NUMBER(8) NOT NULL,
DAT VARCHAR2(100)
);
CREATE INDEX MYTABLE_IDX_1 ON MYTABLE (DAT);
/* Perform inserts into MYTABLE where some DAT are null */
SELECT COUNT(*) FROM MYTABLE WHERE DAT IS NULL;
Окончание SELECT
не сможет использовать индекс, потому что листья (самый правый столбец) не будут захватывать нули. Решение Burleson глупо, потому что теперь вы должны использовать NVL во всех ваших запросах и скомпрометировать данные в таблицах. Метод Горбачева включает в себя известный NOT NULL
столбец для листьев b-дерева, но это расширяет индекс без причины. Возможно, в его случае индекс имел смысл для настройки других запросов, но если все, что вы хотите сделать, это найти NULL
s, то самое простое решение - сделать лист постоянным.
CREATE INDEX MYTABLE_IDX_1 ON MYTABLE (DAT, 1);
Теперь все листья являются константами (1), и по умолчанию все нули будут вместе (либо в верхней, либо в нижней части индекса, но это не имеет большого значения, так как Oracle может использовать индекс вперед или в обратном направлении). Для этой константы существует небольшая потеря памяти, но одно число меньше, чем у большинства других полей данных в типичной таблице. Теперь база данных может использовать индекс при запросе пустых значений ... если оптимизатор находит, что это лучший способ получить данные.