powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормозит запрос с условием where поле in (подзапрос)
25 сообщений из 48, страница 1 из 2
Тормозит запрос с условием where поле in (подзапрос)
    #39660664
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, привет.

Вкратце: два запроса по отдельности работают быстро. Склеиваем (один становится подзапросом второго) - адские тормоза.
Что делать?

Детально:
Есть подзапрос (запрос1): выполняется за 0.04 секунды. Результат - 4 записи (строки).
Есть запрос2: select * from view_name where field_name in (<через запятую результат запроса 1>). Результат получаем за 0.2 секунды.
Но если написать: select * from view_name where field_name in (запрос1) - то результат ждём больше минуты.
Куда копать? Что попробовать?

Всё усугубляется вот чем:
1) оба запроса (запрос1 и запрос2) - выбирают данные через дб-линк.
2) на view_name (из запроса2) повешана ограничивающая политика, которая бегает в "местные" таблички, которые без дб-линка. Снимаю политики - всё работает приемлемо (1.2 сек).

Что я делал:
Смотрел план запроса: стоимость небольшая (270). Но мало деталей - доходим до дб-линка, и дальше нет информации.
Пытался переписать на exists - результат ещё хуже, больше 5ти минут.
Собирал статистику по таблицам - без изменений.

DBMS_STATS.GATHER_TABLE_STATS (
ownname => p$owner,
tabname => p$name,
estimate_percent => SYS.DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL INDEXED COLUMNS SIZE AUTO',
granularity => 'ALL',
degree => 8,
cascade => TRUE
);


Конструкция with перед запросом - решает проблему (0.2сек). Но порождает иную проблему: наш конструктор запросов в АРМе (а всё происходит в АРМе при поиске по нескольким конкретным полям) плохо умеет с ней работать.
Hint 'push_subq' - никак не помог.
Оракл 11.2
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660669
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22,

Пробовали материализовывать 1ый запрос?
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660670
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
select * from view_name t1 join (запрос1) t2 on t1.field_name = t2.поле
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660674
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DshedooПробовали материализовывать 1ый запрос?
Как мне кажется, не подойдёт.
В первый запрос передаётся параметр (номер счёта), и выборка первого запроса делается из огромной таблицы (список всех операций по всем счетам) по этому параметру. Выборка делается моментально.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660677
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo
Код: plsql
1.
select * from view_name t1 join (запрос1) t2 on t1.field_name = t2.поле


Да, работает.
Тут мой косяк, что забыл это упомянуть. Мы тут опять я натыкаюсь на конструктор запросов нашего АРМа, который умеет к основной выборке после условия where добавлять строку AND (и тут та самая конструкция, которую я пытался сделать через запрос1).
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660694
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22,

Т.е. Ваш АРМ не умеет делать
Код: plsql
1.
select a.* from table1 a, table2 b

?
Тогда Вам на форум АРМа

Или можете сделать view ... и вот тогда ....
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660714
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLshurka22,

Т.е. Ваш АРМ не умеет делать
Код: plsql
1.
select a.* from table1 a, table2 b

?
Тогда Вам на форум АРМа

Или можете сделать view ... и вот тогда ....
Не совсем так :)

Наш АРМ может делать любой запрос. Например "select * from accounts". АРМ дополнительно ограничивает выборку в 100 записей, и в базу отдаётся запрос вида "select * from accounts where rownum<=100"
Ещё у АРМа дополнительно есть поля поиска. И если поле поиска введено, то АРМ к запросу добавляет строку, которую я указываю для этого поля поиска.
Например поле поиска по валюте, к нему добавляем строку "CURRENCY = :entered_currency", и получаем запрос в базу
"select * from accounts where rownum<=100 and CURRENCY = :entered_currency"
Всё работает не первый год.

А на этот раз я написал условие для очередного поля поиска немного посложнее: "field_name in (select xxx from yyy where zzz = :entered_value)", и получил проблему. Бьюсь уже два дня. Думал, вдруг кто наскоком подскажет какой-нибудь умный ход или хинт.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660717
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22,

Если конструктор односложный, тогда действительно проще будет сделать новую вьюху, как и предложено было ранее.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660723
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22,

С односложным конструктором надо тюнить под него
1. и на мой взгляд самое простое - view
2. тут уже изврат, проверить можно ли так:
вместо "field_name in (select xxx from yyy where zzz = :entered_value)"
написать "id in (select a.id from account a, yyy where yyy.zzz = :entered_value and a.field_name = yyy.xxx)"

или с rowid побаловаться
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660727
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22....
А на этот раз я написал условие для очередного поля поиска немного посложнее: "field_name in (select xxx from yyy where zzz = :entered_value)", и получил проблему. Бьюсь уже два дня. Думал, вдруг кто наскоком подскажет какой-нибудь умный ход или хинт.
Так АРМ позволяет хинты указывать?
Вроде push_subq должен был помочь, но Вы говорите "никак не помог" и планов не показываете. Есть подозрение, что хинт просто был не корректно указан.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660729
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL1. и на мой взгляд самое простое - view

Не совсем понял, что именно имеете ввиду. И так уже всё через разнообразные view работает.
MaximaXXL2. тут уже изврат, проверить можно ли так:
вместо "field_name in (select xxx from yyy where zzz = :entered_value)"
написать "id in (select a.id from account a, yyy where yyy.zzz = :entered_value and a.field_name = yyy.xxx)"

Интересная мысль, но проверил - не помогло. :(
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660731
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22Конструкция with перед запросом - решает проблему (0.2сек). Но порождает иную проблему: наш конструктор запросов в АРМе (а всё происходит в АРМе при поиске по нескольким конкретным полям) плохо умеет с ней работать. А если WITH засунуть в подзапрос - ваш АРМ поймет, что он есть или скушает и не подавится?
Пример того, о чем речь...
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660733
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

что-то фидл штормит....
пусть будет тут открытым текстом:
Код: plsql
1.
2.
3.
4.
5.
select *
  from (
          with t as (select * from dual)
            select * from t
       ) v
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660736
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина АннаА если WITH засунуть в подзапрос - ваш АРМ поймет, что он есть или скушает и не подавится?
Ох, какие тут извращенцы собрались (доктор, откуда у вас эти картинки?) :)
Попробовал - не помогло. :(
То есть АРМ не подавился, но время то же самое - минута, вместо 0.2сек.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660741
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, извиняюсь, что исчезаю на самом интересном месте - корпоративный автобус ждать не будет. Продолжу изыскания завтра.
Спасибо всем за участие.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660743
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22,

тогда возникают сильные сомнения, что с WITH оно у вас работало за 0.2 сек.

Либо, сравните планы запросов с WITH - вашего и моего, если есть такая возможность. Возможно, дело в [не] материализации WITH-подзапроса в быстром случае...
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660747
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22И так уже всё через разнообразные view работает.(
просто ремарка:
Потому, не всегда правильно строить на вьшках многостраничные вложенные запросы.

В Вашем случае, может попробовать не использовать готовую вьюшку а создать уже с нужными данными новую? Тогда в арме можно пользоваться условием логики ничего не соединяя.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660749
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22,
Вот так должно было быть:
сначала выбирается все во вьюшке, потом накладывается фильтр на результат вьюшки..
Потому, не всегда правильно строить на вьшках многостраничные вложенные запросы.

В Вашем случае, может попробовать не использовать готовую вьюшку а создать уже с нужными данными новую? Тогда в арме можно пользоваться условием логики ничего не соединяя.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660754
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[stells2, так с материализацией подзапроса или с push_subq должно получится тоже самое.

для автоматических построителей запроса, in все же более удобная конструкция, чем городить 100500 view со всеми возможными комбинациями условий. IMHO

но без конкретных запросов которые из ARM уходят на сервер и без планов - гадание на кофейной гуще.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660767
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Это же просто вариант :) Каждый конкретный случай надо конкретно рассматривать.
Просто, иной раз совсем нет необхомости тащить все из вьюшки м сканить все.

Я вот сегодня случайно набрел на такую штуку:
1. SELECT ... FROM T1 INNER JOIN T0 ON... цена 700 и время 0,26
Меняю на
2. SELECT ... FROM T0 INNER JOIN T1 ON... цена упала существенно, время в 2 раза.
T0 - это из WITH подготовленный запрос, в общем простой - выборка по диапазону дат 3-х полей из таблицы.
Т1 - целевая таблица

Вот такой нюанс. Планы давали правильные индексы и прочее.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660771
Koresh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2,
раз уж тут обсуждаются разные изощренные варианты, можно попробовать еще так:

select * from view_name
where 0< (select count (*)
from <здесь из запроса 1>
where <некое поле>=view_name.field_name
)
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660777
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, есть документация по Oracle, есть планы запросов....

Форум sql.ru вообще в какой-то балаган преврашается. Программирование методом тыка. (((

IMHO
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660782
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevГоспода, есть документация по Oracle, есть планы запросов....

Форум sql.ru вообще в какой-то балаган преврашается. Программирование методом тыка. (((

IMHO
А при чем тут oracle? Выше ТСа уже отправили на форум по АРМу, и правильно.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660854
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevПрограммирование методом тыкаНу хоть как то помочь
Код: plsql
1.
select * from view_name v where exists (select rowid from any_tbl a where a.id = v.id) 
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660857
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22Dshedoo
Код: plsql
1.
select * from view_name t1 join (запрос1) t2 on t1.field_name = t2.поле



Да, работает.
Тут мой косяк, что забыл это упомянуть. Мы тут опять я натыкаюсь на конструктор запросов нашего АРМа, который умеет к основной выборке после условия where добавлять строку AND (и тут та самая конструкция, которую я пытался сделать через запрос1).А что мешает в конце дописать кляузу?
Код: plsql
1.
where 1 = 1
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормозит запрос с условием where поле in (подзапрос)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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