|
|
|
Тормозит запрос с условием 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?fid=52&msg=39661196&tid=1883845]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
204ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 529ms |

| 0 / 0 |
