Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Подхватить индексы, используя OR  [new]
Brahmaputr
Guest
Упрощенно есть запрос к вьюшке с
where f1 = :p1
      or f2 = :p2
      or f3 = :p3

План выдает фулскан и длится оч долго.
Но при этом на таблице вьюшке есть индексы по f1, по f2 и по f3 и если запрос разбить на 3 части через union all, то каждый индекс подхватывается и запрос выполняется меньше чем за секунду. Но надо то же самое сделать в одном запросе через OR, ибо в рекурсивном варианте юнион не прокатывает:
ORA-32041: UNION ALL operation in recursive WITH clause must have only two branches
6 окт 16, 10:11    [19749262]     Ответить | Цитировать Сообщить модератору
 Re: Подхватить индексы, используя OR  [new]
use_concat
Guest
Brahmaputr
UNION ALL operation in recursive WITH clause must have only two branches
with t as (( ... union ... union ... )) ...
6 окт 16, 10:14    [19749272]     Ответить | Цитировать Сообщить модератору
 Re: Подхватить индексы, используя OR  [new]
Brahmaputr
Guest
use_concat, не понял. Вот например
WITH rec (f1, f2, f3)
      AS (SELECT f1, f2, f3 FROM TEST WHERE f1=:p)
          UNION ALL
          SELECT f1, f2, f3
            FROM test t,
                 rec
           WHERE t.f1 = rec.f1
              OR t.f2 = rec.f2
              OR t.f3 = rec.f3)
  SELECT * FROM rec
CYCLE...

Как переписать его, разбив OR на юнион? Делать три вложенных рекурсивных запроса? Не вариант.
Мне бы просто подхватить индексы )
6 окт 16, 10:26    [19749337]     Ответить | Цитировать Сообщить модератору
 Re: Подхватить индексы, используя OR  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2852
Brahmaputr,

1. Версия
2. Статистика
6 окт 16, 10:34    [19749362]     Ответить | Цитировать Сообщить модератору
 Re: Подхватить индексы, используя OR  [new]
Brahmaputr
Guest
AlexFF__, 11.2, собрана.
6 окт 16, 10:39    [19749385]     Ответить | Цитировать Сообщить модератору
 Re: Подхватить индексы, используя OR  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2852
Brahmaputr
AlexFF__, 11.2, собрана.

Если хочешь разобраться, то смотри план.
Или просто попробуй hint use_concat
6 окт 16, 10:44    [19749397]     Ответить | Цитировать Сообщить модератору
 Re: Подхватить индексы, используя OR  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Brahmaputr,

Кроме предложенного use_concat (не факт, что он сработает в рекурсивном члене, но попробовать можно) еще можно
1) развернуть набор данных (unpivot) и вообще уйти от соединения по OR (если специфика позволяет - более одного условия не срабатывает для одной строки)
2) перейти на MSSQL. Там нет такого нелепого ограничения.
3) сделать цикл на PL/SQL. Скорее всего это будет еще быстрее.
6 окт 16, 12:38    [19750033]     Ответить | Цитировать Сообщить модератору
 Re: Подхватить индексы, используя OR  [new]
booby
Member

Откуда:
Сообщений: 2249
Brahmaputr,

для комбинирования индексов есть хинты and_equal, index_join и index_combine
вероятно, вас должны интересовать and_equal и index_combine
6 окт 16, 13:50    [19750424]     Ответить | Цитировать Сообщить модератору
 Re: Подхватить индексы, используя OR  [new]
а если
Guest
bitmap индексы?
6 окт 16, 15:25    [19751033]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить