powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормозит запрос с условием where поле in (подзапрос)
48 сообщений из 48, показаны все 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
Тормозит запрос с условием 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
48 сообщений из 48, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормозит запрос с условием where поле in (подзапрос)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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