Битовый индекс на основе функций Oracle - PullRequest
0 голосов
/ 10 января 2019

Я использую Oracle 11g, и у меня есть три таблицы, а именно, TABLE_1, TABLE_2, TABLE_3. В операторе выбора мне нужно выполнить следующий запрос:

SELECT 
    -- // ommitted
FROM
    TABLE_1,
    TABLE_2,
    TABLE_3
WHERE
    -- // ommitted
    AND NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0)
    AND (TABLE_1.COL_2 = TABLE_3.COL OR NVL(TABLE_1.COL_2, 0) = 0)

Я хочу создать растровый индекс на основе функций для следующих элементов:

  • NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0)
  • (TABLE_1.COL_2 = TABLE_3.COL OR NVL(TABLE_1.COL_2, 0) = 0)

Возможно ли это?

Для NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0) Я пробовал:

CREATE BITMAP INDEX TABLE_1_TABLE_2_NVL_COL_IDX 
ON     TABLE_1 (TABLE_2.COL) 
FROM   TABLE_1, TABLE_2
WHERE  NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0);

Но выдало ошибку:

ORA-25954: missing primary key or unique constraint on dimension
25954. 00000 -  "missing primary key or unique constraint on dimension\n"
*Cause:    An attempt to create a join index was made, which failed
           because one or more dimensions did not have an appropriate
           constraint matching the join conditions.
*Action:   Ensure that the where clause is correct (contains all of the
           constraint columns) and that an enforced constraint is on
           each dimension table.

Если я смогу создать индексы, то будет ли следующий синтаксис правильным способом давать подсказки в операторе select?:

SELECT 
    /*+ INDEX (TABLE_1 TABLE_1_TABLE_2_NVL_COL_IDX) */
    /*+ INDEX (TABLE_1 TABLE_1_TABLE_3_NVL_COL_IDX) */
    -- // ommitted

1 Ответ

0 голосов
/ 10 января 2019

На индексы растровых соединений накладывается ряд ограничений . А именно:

  • Невозможно создать индекс соединения на основе функций.

  • Столбцы таблицы измерений должны быть либо столбцами первичного ключа, либо иметь уникальные ограничения.

Первый исключает наличие nvl (col, 0) в индексе

Второй объясняет ошибку, которую вы получаете. Вам необходимо добавить основное или уникальное ограничение на table_2.col. Что также подразумевает, что в этом столбце не должно быть нулевых значений!

Так что вам понадобится другой подход к индексации для этого запроса.

...