|
|
|
Тормозит запрос с условием 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 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
stells2сначала выбирается все во вьюшке, потом накладывается фильтр на результат вьюшки..Это вы сами придумали такое или где подглядели? То есть про "сливаемость" и "проталкиваемость" представлений вы не слышали? Нет, оно понятно, что бывают и несливаемо-непроталкиваемые представления... Но это же - лишь частный случай. В общем случае - оракл постарается раскрыть представление до уровня базовых таблиц, либо пропихнуть в него предикаты. ВТо есть - сделает всё возможное, чтобы "ничего не делать" или "делать как можно меньше"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 16:16 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Щукина Анна, статья по теме . якорей в статье не расставлено, поэтому читать с параграфа "Представления и слияние /проталкивание" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 16:19 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Если хочется хинтами, то можно попробовать /*+ DRIVING_SITE */ если он пытается данный фильтр наложить после того как данные вытащит сюда по линку. либо /*+ UNNEST*/ /*+ NO_UNNEST*/ если нужно подзапрос слить/неслить. Но сперва хотелось бы план запроса всеже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 17:30 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Щукина АннаЭто вы сами придумали такое или где подглядели? подглядел конечно, было время. Щукина АннаНет, оно понятно, что бывают и несливаемо-непроталкиваемые представления... всякое бывает. Рассчитывать что не Щукина Анначастный случай. и запрос будет переписан не приходится, пока явного нет плана выполнения, на конкретном сервере с его персональными настройками, для конкретных вьющек и остальное. А то, что рассмотрел Том - все и есть частный случай. :) Далеко не всего запросы переписываются. И индексы не всегда выбираются оптимально и прочее, для чего хинты и есть. Ладно, будет завтра будет пища. ps: спасибо, любая полезная ссылка всегда полезна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2018, 17:30 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Коллеги, спасибо всем. Всё получилось. Кому лень читать: помогло добавить хинт --+ ordered use_nl(t1) Немного деталей: Особенно спасибо за то, что потребовали план запроса внимательнее посмотреть. Видимо я ненастоящий программист, и сходу план запроса мне не показался каким-то дорогим. Всего-то cost 274. Но я не обратил внимания, что запрос (миллионы записей в view_name) и подзапрос(десятки/сотни) записей женятся через hash join. Гораздо правильнее там был бы nested loops. Кстати: запрос через with работал как раз через nested loops: with t2 as (подзапрос1) select * from view_name join t2 on ... Но повторюсь, существующий конструктор АРМов так делать не умеет. Доработка конструктора АРМа - крайне долгая вещь (сторонний разработчик). Можно только добавлять условия к where через and (за неимением горничной, имеем прачку). В итоге получился запрос, который работает быстро во всех вариантах поиска: select --+ ordered use_nl(t1) * from view_name t1 where field_name in (запрос1) cost 538 (в 2 раза больше, чем без хинтов), но скорость работы - в сотню раз выше (быстрее). Для меня пока немного осталось загадкой, почему надо указывать ordered, а не leading. И почему в use_nl хватило указать только одну таблицу, и не надо указывать подзапрос. Но поди разберусь. Что ещё интересно. Я уже говорил, но снова поясню: основные таблицы (из примера) у меня выбираются через дб-линк, а политики доступа (policies) обращаются в таблицы текущей базы, чтобы проверить, есть ли у оператора доступ к выбираемым записям. В итоге с политиками, как только показывалась таблица за дб-линком, в плане запроса была запись REMOTE, и всё, без деталей. А там за дб-линком была 4х-этажная view со своими медведем и цыганами. Как только политики убираю, происходит вот что: 1) план запроса детально показывает, что происходит за дб-линком. Первой записью стоит магической "SELECT STATEMENT REMOTE", и далее полный план запроса там, за дб-линком. 2) оракл сам решает делать nested loops без всяких хинтов. Ещё раз: всем спасибо за участие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 09:23 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Щукина Анна, Вот простой и реальный пример, в общем классическая связка обычная без извратов. В первом случае вызываем вьюшку во втором, тот же запрос в прямую. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Id Operation Name Rows Bytes Cost (%CPU) Time 0 SELECT STATEMENT 5243K 715M 17737 (1) 00:03:33 1 PX COORDINATOR 2 PX SEND QC (RANDOM) :TQ10002 5243K 715M 17737 (1) 00:03:33 *3 FILTER *4 HASH JOIN OUTER 5243K 715M 17737 (1) 00:03:33 5 PX RECEIVE 54208 529K 304 (0) 00:00:04 6 PX SEND HASH :TQ10001 54208 529K 304 (0) 00:00:04 7 PX BLOCK ITERATOR 54208 529K 304 (0) 00:00:04 8 TABLE ACCESS FULL A2 54208 529K 304 (0) 00:00:04 9 BUFFER SORT 10 PX RECEIVE 5243K 665M 17424 (1) 00:03:30 11 PX SEND HASH :TQ10000 5243K 665M 17424 (1) 00:03:30 12 TABLE ACCESS FULL A1 5243K 665M 17424 (1) 00:03:30 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. тот же запрос без вьюшки Код: plsql 1. 2. 3. 4. 5. 6. Id Operation Name Rows Bytes Cost (%CPU) Time 0 SELECT STATEMENT 14 2002 66 (0) 00:00:01 1 NESTED LOOPS OUTER 14 2002 66 (0) 00:00:01 2 TABLE ACCESS BY INDEX ROWID A2 1 10 3 (0) 00:00:01 *3 INDEX RANGE SCAN PK_A2_H_ID 1 2 (0) 00:00:01 4 TABLE ACCESS BY INDEX ROWID A1 14 1862 63 (0) 00:00:01 *5 INDEX RANGE SCAN IDX_A1_H_ID 1433 2 (0) 00:00:01 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 11:00 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
stells2, ну вот вы своими же планами и подтвердили мои слова.... в плане запроса "вызываем вьюшку " нигде не "материализовалась" вьюха. у вас в обоих случаях запрос разобран до уровня базовых таблиц. то есть, представление сервером было благополучно "слито"... Сказать-то что хотели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 11:14 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
stells2, а разница в кардинальностях выборок и задействованному параллелизму в первом случае - намекает на то, что вы не до конца честны с нами и запросы катали в разных базах / с разными настройками статистик, параметров сессии... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 11:33 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Щукина Аннаstells2, а разница в кардинальностях выборок и задействованному параллелизму в первом случае - намекает на то, что вы не до конца честны с нами и запросы катали в разных базах / с разными настройками статистик, параметров сессии... Понятно. Нет, одна база, один сервер, на обеде специально для вас и сделал, последовательность действий перед глазами. Другого у вас объяснения нет, видимо, да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 11:46 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Щукина Анна, А теперь, просто отвелекитесь на минутку от своих верований и просто посмотрите на результат селект из вьшки 00:03:33 и селект прямой 00:00:01 - есть разница? Без всяких планов и прочего. Вот об этом и была речь, а умничать можно много без смысла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 11:50 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
stells2, я понимаю, что у вас "джентльмены верят друг другу на слово", но показанные вами же результаты не дают повода верить вам на слово... остаюсь при своем мнение - вы, мягко говоря, привираете, пытаясь выдать желаемое за действительное... "верования" и "умничиния" тут ни при чем. приведите репрезентативные доказательные тесты и я прилюдно "посыплю себе голову пеплом". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 12:03 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
А можно я со своей дилетантской точки зрения уточню? Во втором запросе у вас условие накладывается на поле основной таблицы: SELECT .. FROM A2 H ... WHERE H.H_ID >= 1065093; А в первом запросе (где через view), условие накладывается на значение функции NVL(A.H_ID, H.H_ID). Ну то есть накладывается на поле из вью V_A1.H_ID, которое на самом деле является значение функции NVL(A.H_ID, H.H_ID). Мы-то со своей колокольни логически понимаем, что для указанного запроса, это будет одно и то же: NVL(A.H_ID, H.H_ID) = H.H_ID Но разве оракл настолько умный, и может залезть внутрь функции NVL, проанализировать, откуда берутся данные, и какое значение в итоге будет получено? Что-то мне сомнительно. Вот оракл и не смог. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 12:25 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Вот если текст вью переписать, и вместо "NVL(A.H_ID, H.H_ID) H_ID" написать "H.H_ID", вот так: CREATE VIEW V_A1 AS SELECT A1_ID, H.H_NUM, H.H_ID, A.STEP, A.P_ID, A.RECTIME, ENAME, ANL, SMPLNO FROM A2 H LEFT OUTER JOIN A1 A ON H.H_ID = A.H_ID; что логически будет то же самое, то запрос через view будет точно таким же быстрым, как и без view. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 12:30 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Щукина Анна, Щукина Аннаstells2, я понимаю, что у вас "джентльмены верят друг другу на слово" ну да, так принято Все намного проще. Просто меняем в теле вьшки запрос: Код: plsql 1. 2. 3. 4. и получаем искомое Код: plsql 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. SELECT .. FROM A2 H ... WHERE H.H_ID >= 1065093; А в первом запросе (где через view), условие накладывается на значение функции NVL(A.H_ID, H.H_ID). Совершенно верно. Я специально привел простой пример, показывающий что может дать вьюшка. По сути, тут использование NVL не имеет смысла, ибо целевой ID всегда не пустой. Но в других запросах, вполне может быть оправданная конструкция, с которой Oracle не справится (да и в общем то не должен). И пойдет у вас полный скан и потом только фильтр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 12:35 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
stells2Совершенно верно. Я специально привел простой пример, показывающий что может дать вьюшка. Ну тогда вы и во втором запросе накладывайте то же самое условие: explain plan FOR SELECT A1_ID, H.H_NUM, NVL(A.H_ID, H.H_ID) H_ID, A.STEP, A.P_ID, A.RECTIME, ENAME, ANL, SMPLNO FROM A2 H LEFT OUTER JOIN A1 A ON H.H_ID = A.H_ID WHERE NVL(A.H_ID, H.H_ID) >= 1065093; select * from table(dbms_xplan.display); Подозреваю, что план и время выполнения сильно изменятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 12:38 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22, Конечно изменится. Но зачем? Вопрос был именно во вьюшках, мы же их делаем как правило для представления "нужных" данных, в нужном виде и т.д. они часто содержат сложный конструкции связи, условия и прочее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 12:54 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
stells2shurka22, Конечно изменится. Но зачем? Вопрос был именно во вьюшках, мы же их делаем как правило для представления "нужных" данных, в нужном виде и т.д. они часто содержат сложный конструкции связи, условия и прочее. Видимо я не так понял предмета вашего спора. Прошу прощенья, что влез. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 12:56 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
shurka22Видимо я не так понял предмета вашего спора. Да не было спора, взрослые люди, занимаемся одним делом, просто разные взгляды бывают Щукина АннаЭто вы сами придумали такое или где подглядели? вот и зацепило А в запрос, с условием по NVL если дабавить просто хинт по индексу A1 уже картинка намного лучше будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 13:02 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Щукина Аннаприведите репрезентативные доказательные тесты и я прилюдно "посыплю себе голову пеплом". Ждемс.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2018, 16:41 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
stells2, ну ждите..... условия вы не выполнили... почему ожидаете, что я стану выполнять? тест у вас шулернический. но даже не смотря на это запрос отработал как и говорилось - с РАСКРЫТИЕМ представления, о чем и был изначальный спор. ловить вас за каждую букву в запросе, чтобы понять где вы именно схитрили, пытаясь обмануть оракл - увольте, и без того есть чем заняться. пример, когда ОДИН И ТОТ ЖЕ запрос ведет себя по разному , будучи вызванным напрямую и через вью - вы так и не привели.... (дремучими версия оракла, не умевшими/плохо умевшими делать трансформацию вью - трясти не надо, если что) Поэтому это мы ждем, как и ранее: репрезентативные доказательные тесты, показывающие вашу правоту (что без вью тот же самый запрос имеет шансы отработать по другому плану) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2018, 17:48 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
stells2, хотя, чего ждать.... "с волками по волчьи".... как вы, так и вам... поэтому, прелюдно посыпаю ВАШУ голову пеплом! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2018, 17:54 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
Щукина Анна, Ну и ладно, этого и ожидал услышать, хотя, надежда конечно была Почему вы вдруг решили что кто-то жульничает (для чего?) - так я и не понял. Выше все дано, а то, что вы не заметили, ну, бывает. Хотя, я в общем специально весь вывод дал, другие на это обратили внимание сразу. Ладно, я не кровожадный. Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2018, 18:59 |
|
||
|
Тормозит запрос с условием where поле in (подзапрос)
|
|||
|---|---|---|---|
|
#18+
А вот это, девушка, было лишнем, подчеркивать свою глу невнимательность Щукина Анна пример, когда ОДИН И ТОТ ЖЕ запрос ведет себя по разному , будучи вызванным напрямую и через вью - вы так и не привели.... Выше все показано, оракле 11. Я думаю Вы сами легко можете повторить мой пример и получить те-же результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2018, 19:11 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1883845]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
181ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 465ms |

| 0 / 0 |
