powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Рассыпается план
6 сообщений из 6, страница 1 из 1
Рассыпается план
    #39345870
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упрощенно, есть таблица
Код: plsql
1.
mtable(f1, f2, f3,....)


есть индексы на таблицу:
...on mtable(f1, f10, f20);
...on mtable(f2, f10, f20);
...on mtable(f3, f10, f20);
Делаешь к ней запросы вида:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select f10, f20 into ...
  from mtable
where f1 = :p1;

select f10, f20 into ...
  from mtable
where f2 = :p1;

select f10, f20 into...
  from mtable
where f3 = :p2;


Каждый из них по отдельности отрабатывает быстро по index range scan соответствующего индекса, не обращаясь к таблице.

Теперь объединяем эти запросы:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select f10, f20
  from mtable
where f1 = :p1
 union all
select f10, f20
  from mtable
where f2 = :p1
 union all
select f10, f20
  from mtable
where f3 = :p2


План показывает, что по каждому запросу теперь кроме обращения к индексу идет и обращение к таблице по rowid
(при этом время выполнения запроса увеличивается минимум, на порядок)
Собственно вопрос, как дальше жить :)
Можно конечно попытаться разбить этот общий запрос на отдельные мелкие, забивай например временную таблицу или коллекцию, но дальше с этими данными надо тоже работать запросом, т.е. не хотелось бы кастовать в table и тем более писать в темповую таблицу.
...
Рейтинг: 0 / 0
Рассыпается план
    #39346289
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avotge,

union без all - пробовали?
Не прокатит?
...
Рейтинг: 0 / 0
Рассыпается план
    #39346291
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Avotge,

на 11.2.0.4 и 12.1.0.2 не воспроизводится. Какая у тебя версия? Покажи план через select * from table(dbms_xplan.display_cursor('&sqlid',null,'advanced').
Еще лучше будет, если приложишь 10053 трассу
...
Рейтинг: 0 / 0
Рассыпается план
    #39346772
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Makar4ik, xtender, спасибо, что откликнулись. Оракл 11.2
К сожалению долго разбираться нет времени.
Позже попробую смоделировать (дома тоже не получилось воспроизвести, но делал не совсем точно), но пока стабильной работы запроса нет:
- или подхватывается не тот индекс, в котором есть все поля запроса, а тот который поменьше размером, то есть просто index(f1) например
- или подхватывается нужный индекс
На трассировку нет прав, беда.
Поэтому разбил на пять отдельных меленьких запросов, каждый из которых достает свои записи в коллекцию (условно rowid).
Потом объединяем эту коллекцию в одну.
И дальше делаем оставшуюся часть запроса.
Так вот часть разбитая на маленькие запросы работает теперь быстро, меньше секунды.
А оставшаяся же часть вообще врубает фулскан, хотя выборка идет по rowid из коллекции добытой на первом этапе.
Вот это вообще не понял )
То есть условно запрос вида:
Код: plsql
1.
2.
3.
with t as (select rowed rid  from ....)
   select * from v_my_view v, t
  where v.rid = t.rid


Врубает фулскан по таблицам вьюшки v_my_view.
Вьюшка v_my_view имеет вид:
Код: plsql
1.
2.
3.
4.
5.
select t.*, rowid rid
  from table1 t
union all
select t.*, rowid rid
  from table2 t


Подзапрос with t возвращает порядка 30строк.
В table1 и table2 50млн строк.
...
Рейтинг: 0 / 0
Рассыпается план
    #39346778
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если делать этот же запрос не к вьюшке из двух таблиц, а к каждой таблице отдельно:
Код: plsql
1.
2.
3.
with t as (select rowed rid  from ....)
   select * from table1 v, t
  where v.rowid = t.rid


или
Код: plsql
1.
2.
3.
with t as (select rowed rid  from ....)
   select * from table2 v, t
  where v.rowid = t.rid


то идет нормальное обращение по rowid
Если идем через вьюшку объединяющую эти две таблицы, обе эти таблицы фулсканятся.
...
Рейтинг: 0 / 0
Рассыпается план
    #39346794
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В итоге пришлось взять весь запрос с union all засунуть в требуемый запрос и к каждой таблице прицепиться по rowid.
В итоге запрос отрабатывает в районе секунды, к чему и стремился.
Плохо, что нет времени разобрать в чем засада-то, что уж и по rowid начинает фулсканить, это надо уметь )))
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Рассыпается план
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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