powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подхватить индексы, используя OR
9 сообщений из 9, страница 1 из 1
Подхватить индексы, используя OR
    #39321646
Brahmaputr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упрощенно есть запрос к вьюшке с
Код: plsql
1.
2.
3.
where f1 = :p1
      or f2 = :p2
      or f3 = :p3


План выдает фулскан и длится оч долго.
Но при этом на таблице вьюшке есть индексы по f1, по f2 и по f3 и если запрос разбить на 3 части через union all, то каждый индекс подхватывается и запрос выполняется меньше чем за секунду. Но надо то же самое сделать в одном запросе через OR, ибо в рекурсивном варианте юнион не прокатывает:
Код: plsql
1.
ORA-32041: UNION ALL operation in recursive WITH clause must have only two branches
...
Рейтинг: 0 / 0
Подхватить индексы, используя OR
    #39321649
use_concat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BrahmaputrUNION ALL operation in recursive WITH clause must have only two brancheswith t as (( ... union ... union ... )) ...
...
Рейтинг: 0 / 0
Подхватить индексы, используя OR
    #39321670
Brahmaputr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
use_concat, не понял. Вот например
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 на юнион? Делать три вложенных рекурсивных запроса? Не вариант.
Мне бы просто подхватить индексы )
...
Рейтинг: 0 / 0
Подхватить индексы, используя OR
    #39321675
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Brahmaputr,

1. Версия
2. Статистика
...
Рейтинг: 0 / 0
Подхватить индексы, используя OR
    #39321686
Brahmaputr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexFF__, 11.2, собрана.
...
Рейтинг: 0 / 0
Подхватить индексы, используя OR
    #39321690
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BrahmaputrAlexFF__, 11.2, собрана.
Если хочешь разобраться, то смотри план.
Или просто попробуй hint use_concat
...
Рейтинг: 0 / 0
Подхватить индексы, используя OR
    #39321811
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Brahmaputr,

Кроме предложенного use_concat (не факт, что он сработает в рекурсивном члене, но попробовать можно) еще можно
1) развернуть набор данных (unpivot) и вообще уйти от соединения по OR (если специфика позволяет - более одного условия не срабатывает для одной строки)
2) перейти на MSSQL. Там нет такого нелепого ограничения.
3) сделать цикл на PL/SQL. Скорее всего это будет еще быстрее.
...
Рейтинг: 0 / 0
Подхватить индексы, используя OR
    #39321885
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Brahmaputr,

для комбинирования индексов есть хинты and_equal, index_join и index_combine
вероятно, вас должны интересовать and_equal и index_combine
...
Рейтинг: 0 / 0
Подхватить индексы, используя OR
    #39322016
а если
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bitmap индексы?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подхватить индексы, используя OR
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]