powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормозит запрос с условием where поле in (подзапрос)
23 сообщений из 48, страница 2 из 2
Тормозит запрос с условием where поле in (подзапрос)
    #39660862
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2сначала выбирается все во вьюшке, потом накладывается фильтр на результат вьюшки..Это вы сами придумали такое или где подглядели? То есть про "сливаемость" и "проталкиваемость" представлений вы не слышали? Нет, оно понятно, что бывают и несливаемо-непроталкиваемые представления... Но это же - лишь частный случай. В общем случае - оракл постарается раскрыть представление до уровня базовых таблиц, либо пропихнуть в него предикаты. ВТо есть - сделает всё возможное, чтобы "ничего не делать" или "делать как можно меньше"...
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660866
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

статья по теме . якорей в статье не расставлено, поэтому читать с параграфа "Представления и слияние /проталкивание"
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39660900
INFINITs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если хочется хинтами, то можно попробовать /*+ DRIVING_SITE */ если он пытается данный фильтр наложить после того как данные вытащит сюда по линку.
либо /*+ UNNEST*/ /*+ NO_UNNEST*/ если нужно подзапрос слить/неслить.

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

подглядел конечно, было время.
Щукина АннаНет, оно понятно, что бывают и несливаемо-непроталкиваемые представления...

всякое бывает.
Рассчитывать что не
Щукина Анначастный случай. и запрос будет переписан не приходится, пока явного нет плана выполнения, на конкретном сервере с его персональными настройками, для конкретных вьющек и остальное. А то, что рассмотрел Том - все и есть частный случай. :)
Далеко не всего запросы переписываются. И индексы не всегда выбираются оптимально и прочее, для чего хинты и есть.

Ладно, будет завтра будет пища.

ps: спасибо, любая полезная ссылка всегда полезна.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661081
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, спасибо всем. Всё получилось.
Кому лень читать: помогло добавить хинт --+ 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 без всяких хинтов.

Ещё раз: всем спасибо за участие.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661145
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,
Вот простой и реальный пример, в общем классическая связка обычная без извратов.
В первом случае вызываем вьюшку во втором, тот же запрос в прямую.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT COUNT(*) FROM A1;
6066915 -- всего записей

SELECT COUNT(*) FROM A2 WHERE H_ID >= 1065093
206 -- записей по фильтру

CREATE VIEW V_A1 AS
    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;

explain plan FOR SELECT * FROM V_A1 WHERE H_ID >= 1065093;
select * from table(dbms_xplan.display);

Plan hash value: 238673394


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.
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - filter(NVL("A"."H_ID","H"."H_ID")>=1065093)
   4 - access("H"."H_ID"="A"."H_ID"(+))
 
Note
-----
   - dynamic sampling used for this statement (level=4)


тот же запрос без вьюшки
Код: plsql
1.
2.
3.
4.
5.
6.
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 H.H_ID >= 1065093;
select * from table(dbms_xplan.display);


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.
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - access("H"."H_ID">=1065093)
   5 - access("H"."H_ID"="A"."H_ID"(+))
       filter("A"."H_ID"(+)>=1065093)
 
Note
-----
   - dynamic sampling used for this statement (level=4)
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661161
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2,

ну вот вы своими же планами и подтвердили мои слова.... в плане запроса "вызываем вьюшку " нигде не "материализовалась" вьюха.
у вас в обоих случаях запрос разобран до уровня базовых таблиц. то есть, представление сервером было благополучно "слито"...

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

а разница в кардинальностях выборок и задействованному параллелизму в первом случае - намекает на то, что вы не до конца честны с нами и запросы катали в разных базах / с разными настройками статистик, параметров сессии...
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661182
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаstells2,
а разница в кардинальностях выборок и задействованному параллелизму в первом случае - намекает на то, что вы не до конца честны с нами и запросы катали в разных базах / с разными настройками статистик, параметров сессии...
Понятно. Нет, одна база, один сервер, на обеде специально для вас и сделал, последовательность действий перед глазами. Другого у вас объяснения нет, видимо, да?
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661188
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,
А теперь, просто отвелекитесь на минутку от своих верований и просто посмотрите на результат
селект из вьшки 00:03:33 и селект прямой 00:00:01 - есть разница? Без всяких планов и прочего.
Вот об этом и была речь, а умничать можно много без смысла.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661196
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2,

я понимаю, что у вас "джентльмены верят друг другу на слово", но показанные вами же результаты не дают повода верить вам на слово...
остаюсь при своем мнение - вы, мягко говоря, привираете, пытаясь выдать желаемое за действительное...
"верования" и "умничиния" тут ни при чем. приведите репрезентативные доказательные тесты и я прилюдно "посыплю себе голову пеплом".
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661209
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно я со своей дилетантской точки зрения уточню?
Во втором запросе у вас условие накладывается на поле основной таблицы:
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, проанализировать, откуда берутся данные, и какое значение в итоге будет получено? Что-то мне сомнительно. Вот оракл и не смог.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661214
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот если текст вью переписать, и вместо "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.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661219
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,
Щукина Аннаstells2,
я понимаю, что у вас "джентльмены верят друг другу на слово"
ну да, так принято
Все намного проще.
Просто меняем в теле вьшки запрос:
Код: plsql
1.
2.
3.
4.
CREATE VIEW V_A1 AS
    SELECT A1_ID,  H.H_NUM,    /* NVL(A.H_ID, H.H_ID) ->*/ 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;


и получаем искомое
Код: plsql
1.
2.
3.
explain plan FOR SELECT * FROM V_A1 WHERE H_ID >= 1065093;
select * from table(dbms_xplan.display);
Plan hash value: 2181453333


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
| 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 |
shurka22Во втором запросе у вас условие накладывается на поле основной таблицы:
SELECT .. FROM A2 H ... WHERE H.H_ID >= 1065093;
А в первом запросе (где через view), условие накладывается на значение функции NVL(A.H_ID, H.H_ID).
Совершенно верно.
Я специально привел простой пример, показывающий что может дать вьюшка.
По сути, тут использование NVL не имеет смысла, ибо целевой ID всегда не пустой. Но в других запросах, вполне может быть оправданная конструкция, с которой Oracle не справится (да и в общем то не должен).
И пойдет у вас полный скан и потом только фильтр.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661221
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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);

Подозреваю, что план и время выполнения сильно изменятся.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661229
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22,
Конечно изменится. Но зачем?
Вопрос был именно во вьюшках, мы же их делаем как правило для представления "нужных" данных, в нужном виде и т.д. они часто содержат сложный конструкции связи, условия и прочее.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661232
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stells2shurka22,
Конечно изменится. Но зачем?
Вопрос был именно во вьюшках, мы же их делаем как правило для представления "нужных" данных, в нужном виде и т.д. они часто содержат сложный конструкции связи, условия и прочее.
Видимо я не так понял предмета вашего спора. Прошу прощенья, что влез.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661238
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22Видимо я не так понял предмета вашего спора.
Да не было спора, взрослые люди, занимаемся одним делом, просто разные взгляды бывают
Щукина АннаЭто вы сами придумали такое или где подглядели? вот и зацепило
А в запрос, с условием по NVL если дабавить просто хинт по индексу A1 уже картинка намного лучше будет.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661390
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаприведите репрезентативные доказательные тесты и я прилюдно "посыплю себе голову пеплом".
Ждемс..
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661711
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2,

ну ждите..... условия вы не выполнили... почему ожидаете, что я стану выполнять?
тест у вас шулернический. но даже не смотря на это запрос отработал как и говорилось - с РАСКРЫТИЕМ представления, о чем и был изначальный спор. ловить вас за каждую букву в запросе, чтобы понять где вы именно схитрили, пытаясь обмануть оракл - увольте, и без того есть чем заняться.
пример, когда ОДИН И ТОТ ЖЕ запрос ведет себя по разному , будучи вызванным напрямую и через вью - вы так и не привели....
(дремучими версия оракла, не умевшими/плохо умевшими делать трансформацию вью - трясти не надо, если что)

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

хотя, чего ждать.... "с волками по волчьи".... как вы, так и вам...
поэтому, прелюдно посыпаю ВАШУ голову пеплом! :)
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661722
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,
Ну и ладно, этого и ожидал услышать, хотя, надежда конечно была
Почему вы вдруг решили что кто-то жульничает (для чего?) - так я и не понял.
Выше все дано, а то, что вы не заметили, ну, бывает. Хотя, я в общем специально весь вывод дал, другие на это обратили внимание сразу.
Ладно, я не кровожадный. Удачи.
...
Рейтинг: 0 / 0
Тормозит запрос с условием where поле in (подзапрос)
    #39661724
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот это, девушка, было лишнем, подчеркивать свою глу невнимательность
Щукина Анна пример, когда ОДИН И ТОТ ЖЕ запрос ведет себя по разному , будучи вызванным напрямую и через вью - вы так и не привели....
Выше все показано, оракле 11.
Я думаю Вы сами легко можете повторить мой пример и получить те-же результаты.
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормозит запрос с условием where поле in (подзапрос)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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