|
|
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Коллеги, привет. Вкратце: два запроса по отдельности работают быстро. Склеиваем (один становится подзапросом второго) - адские тормоза. Что делать? Детально: Есть подзапрос (запрос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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 11:05 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22, Пробовали материализовывать 1ый запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 11:16 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 11:17 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
DshedooПробовали материализовывать 1ый запрос? Как мне кажется, не подойдёт. В первый запрос передаётся параметр (номер счёта), и выборка первого запроса делается из огромной таблицы (список всех операций по всем счетам) по этому параметру. Выборка делается моментально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 11:20 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Dshedoo Код: plsql 1. Да, работает. Тут мой косяк, что забыл это упомянуть. Мы тут опять я натыкаюсь на конструктор запросов нашего АРМа, который умеет к основной выборке после условия where добавлять строку AND (и тут та самая конструкция, которую я пытался сделать через запрос1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 11:26 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22, Т.е. Ваш АРМ не умеет делать Код: plsql 1. ? Тогда Вам на форум АРМа Или можете сделать view ... и вот тогда .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 12:08 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
MaximaXXLshurka22, Т.е. Ваш АРМ не умеет делать Код: plsql 1. ? Тогда Вам на форум АРМа Или можете сделать 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)", и получил проблему. Бьюсь уже два дня. Думал, вдруг кто наскоком подскажет какой-нибудь умный ход или хинт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 12:45 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22, Если конструктор односложный, тогда действительно проще будет сделать новую вьюху, как и предложено было ранее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 12:51 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
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 побаловаться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:05 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22.... А на этот раз я написал условие для очередного поля поиска немного посложнее: "field_name in (select xxx from yyy where zzz = :entered_value)", и получил проблему. Бьюсь уже два дня. Думал, вдруг кто наскоком подскажет какой-нибудь умный ход или хинт. Так АРМ позволяет хинты указывать? Вроде push_subq должен был помочь, но Вы говорите "никак не помог" и планов не показываете. Есть подозрение, что хинт просто был не корректно указан. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:15 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
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)" Интересная мысль, но проверил - не помогло. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:17 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22Конструкция with перед запросом - решает проблему (0.2сек). Но порождает иную проблему: наш конструктор запросов в АРМе (а всё происходит в АРМе при поиске по нескольким конкретным полям) плохо умеет с ней работать. А если WITH засунуть в подзапрос - ваш АРМ поймет, что он есть или скушает и не подавится? Пример того, о чем речь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:19 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Щукина Анна, что-то фидл штормит.... пусть будет тут открытым текстом: Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:23 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Щукина АннаА если WITH засунуть в подзапрос - ваш АРМ поймет, что он есть или скушает и не подавится? Ох, какие тут извращенцы собрались (доктор, откуда у вас эти картинки?) :) Попробовал - не помогло. :( То есть АРМ не подавился, но время то же самое - минута, вместо 0.2сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:26 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Коллеги, извиняюсь, что исчезаю на самом интересном месте - корпоративный автобус ждать не будет. Продолжу изыскания завтра. Спасибо всем за участие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:28 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22, тогда возникают сильные сомнения, что с WITH оно у вас работало за 0.2 сек. Либо, сравните планы запросов с WITH - вашего и моего, если есть такая возможность. Возможно, дело в [не] материализации WITH-подзапроса в быстром случае... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:29 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22И так уже всё через разнообразные view работает.( просто ремарка: Потому, не всегда правильно строить на вьшках многостраничные вложенные запросы. В Вашем случае, может попробовать не использовать готовую вьюшку а создать уже с нужными данными новую? Тогда в арме можно пользоваться условием логики ничего не соединяя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:33 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22, Вот так должно было быть: сначала выбирается все во вьюшке, потом накладывается фильтр на результат вьюшки.. Потому, не всегда правильно строить на вьшках многостраничные вложенные запросы. В Вашем случае, может попробовать не использовать готовую вьюшку а создать уже с нужными данными новую? Тогда в арме можно пользоваться условием логики ничего не соединяя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:34 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
[stells2, так с материализацией подзапроса или с push_subq должно получится тоже самое. для автоматических построителей запроса, in все же более удобная конструкция, чем городить 100500 view со всеми возможными комбинациями условий. IMHO но без конкретных запросов которые из ARM уходят на сервер и без планов - гадание на кофейной гуще. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 13:40 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
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 - целевая таблица Вот такой нюанс. Планы давали правильные индексы и прочее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 14:00 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
stells2, раз уж тут обсуждаются разные изощренные варианты, можно попробовать еще так: select * from view_name where 0< (select count (*) from <здесь из запроса 1> where <некое поле>=view_name.field_name ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 14:06 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Господа, есть документация по Oracle, есть планы запросов.... Форум sql.ru вообще в какой-то балаган преврашается. Программирование методом тыка. ((( IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 14:12 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevГоспода, есть документация по Oracle, есть планы запросов.... Форум sql.ru вообще в какой-то балаган преврашается. Программирование методом тыка. ((( IMHO А при чем тут oracle? Выше ТСа уже отправили на форум по АРМу, и правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 14:18 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevПрограммирование методом тыкаНу хоть как то помочь Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 16:08 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22Dshedoo Код: plsql 1. Да, работает. Тут мой косяк, что забыл это упомянуть. Мы тут опять я натыкаюсь на конструктор запросов нашего АРМа, который умеет к основной выборке после условия where добавлять строку AND (и тут та самая конструкция, которую я пытался сделать через запрос1).А что мешает в конце дописать кляузу? Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 16:11 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39660714&tid=1883845]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
179ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 489ms |

| 0 / 0 |
