Oracle: использовать индекс для поиска нулевых значений - PullRequest
0 голосов
/ 27 января 2012

Я провел некоторый поиск, но предпочитаю что-то вроде подсказки или подобного

http://www.dba -oracle.com / oracle_tips_null_idx.htm

http://www.oracloid.com/2006/05/using-index-for-is-null/

Ответы [ 3 ]

2 голосов
/ 29 января 2012

Как насчет функционального индекса с использованием NVL2, например:

CREATE TABLE foo (bar INTEGER);
INSERT INTO foo VALUES (1);
INSERT INTO foo VALUES (NULL);
CREATE INDEX baz ON foo (NVL2(bar,0,1));

, а затем;

DELETE plan_table;
EXPLAIN PLAN FOR SELECT * FROM foo WHERE NVL2(bar,0,1) = 1;
SELECT operation, object_name FROM plan_table;

должен дать вам

OPERATION        OBJECT_NAME
---------------- -----------
SELECT STATEMENT
TABLE ACCESS     FOO
INDEX            BAZ        << yep
1 голос
/ 27 января 2012

Если вы спрашиваете: «Как создать индекс, который позволил бы использовать его при поиске значений NULL в определенном поле», я предлагаю создать индекс для интересующего вас поля PLUS.поле первичного ключа.Таким образом, если у вас есть таблица с именем A_TABLE, с полем VAL, в котором вы хотите искать значения NULL, и первичный ключ с именем PK, я бы создал индекс для (VAL, PK).

Shareи наслаждайся.

1 голос
/ 27 января 2012

Я собираюсь "ответить" на не вопрос выше.

Статьи, на которые вы ссылаетесь, довольно правильные - индексы 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 может использовать индекс вперед или в обратном направлении). Для этой константы существует небольшая потеря памяти, но одно число меньше, чем у большинства других полей данных в типичной таблице. Теперь база данных может использовать индекс при запросе пустых значений ... если оптимизатор находит, что это лучший способ получить данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...