powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Производительность запроса
16 сообщений из 16, страница 1 из 1
Производительность запроса
    #37398120
Alexggg99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема:
Медленно открывается интерактивный отчет.
Запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<table1>,...,<table2> where 
( (:P2_DATE_FILTER_TYPE =  1  and  cr.ord_date between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy'))
or (:P2_DATE_FILTER_TYPE =  2  and  tt.arrival_date between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy'))
or (:P2_DATE_FILTER_TYPE =  3  and  
     ((cr.ord_date between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy'))or
     (tt.arrival_date between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy'))))
or (:P2_DATE_FILTER_TYPE =  4  and  vd.voch_date between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy'))
or (:P2_DATE_FILTER_TYPE =  5  and  g.gtd_date between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy'))
or (:P2_DATE_FILTER_TYPE =  6  and  ow3.date_out between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy'))
or (:P2_DATE_FILTER_TYPE =  7  and  o.complete_date between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy'))   
or (:P2_DATE_FILTER_TYPE =  8  and  o.finance_complete between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy'))   
) ...
ord_1=ord_2
...


Заметил что узкое место именно в проверки этих условий. Как им можно обойти?? На странице пользователь вводит много условий отбора.
...
Рейтинг: 0 / 0
Производительность запроса
    #37398179
haXbat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexggg99,

Если можно осуществлять поиск только по одному из многих критериев, то попробуйте поставить тип запроса PL/SQL function body returning SQL query и не использовать пустые условия отбора. Преобразования to_date в where тоже лишние.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE
   search_1   VARCHAR2 ( 300 ) := '';
BEGIN
   IF :P2_DATE_FILTER_TYPE =  4 
   THEN
      search_1 := ' and vd.voch_date between :P2_DATE_FROM and :P2_DATE_TO ';
   END IF;

   IF :P2_DATE_FILTER_TYPE =  5 
   THEN
      search_1 := search_1 || ' and g.gtd_date between :P2_DATE_FROM and :P2_DATE_TO ';
   END IF;

   RETURN 'select * from my_table where 1=1 ' || search_1;
END;
...
Рейтинг: 0 / 0
Производительность запроса
    #37398183
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexggg99,

это не запрос. Это набор предикатов, демонстрирующий непонятный мне подход. Вы могли бы сменить его:
0. На несколько сохранённых общих отчётов, благо, отчёт у Вас интерактивный. У каждого отчёта выставить соответствующие фильтры, дать отчётам вразумительное название.
1. На PL/SQL function body returning SQL query в Source, возвращая запрос с нужным предикатом в зависимости от значения P2_DATE_FILTER_TYPE.
...
Рейтинг: 0 / 0
Производительность запроса
    #37398193
Alexggg99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
haXbat,

Дело в том что я использую Interective Report там как это проделать??
...
Рейтинг: 0 / 0
Производительность запроса
    #37398219
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
haXbatПреобразования to_date в where тоже лишние.
Вы уверены?
...
Рейтинг: 0 / 0
Производительность запроса
    #37398229
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо дело в большом количестве соединений и выбираемых данных.

1. По всем столбцам типа cr.ord_date добавить индекс.
2. Добавить обязательные фильтры и уменьшить выборку результирующих данных.
Или оптимизировать для выборки первых записей с использованием совместимого с этим подходом pagination.
3. Можно еще ради эксперимента попробовать заменить на:
decode( :P2_DATE_FILTER_TYPE, 1, cr.ord_date, 2, tt.arrival_date, ... ) between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy')
4. Создание Dynamic IR http://www.oracleapplicationexpress.com/tutorials/71
...
Рейтинг: 0 / 0
Производительность запроса
    #37398247
Alexggg99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvUser,
Не получается запихать
PL/SQL function body returning SQL query в Source
есть ещё какой нибудь способ. Запрос действительно соединяет много таблиц (40 таблиц) и на входе у него много переменных параметров.
...
Рейтинг: 0 / 0
Производительность запроса
    #37398256
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexggg99SvUser,
Не получается запихать
PL/SQL function body returning SQL query в Source
так и не надо, см. решение по ссылке.

Alexggg99есть ещё какой нибудь способ. Запрос действительно соединяет много таблиц (40 таблиц) и на входе у него много переменных параметров.
как я уже сказал, оптимизировать на выборку первых записей или менять подходы к организации фильтров.
...
Рейтинг: 0 / 0
Производительность запроса
    #37398267
haXbat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLerВы уверены?
Отчасти я не прав: исходил из того, что по умолчанию в приложении на клиенте строго проверяется вводимые даты на формат 'dd.mm.yyyy' перед выполнением запроса. Иначе какой смысл вообще выполнять запрос, если пользователь ввел в поле вместо корректной даты "10" или воообще "валера" ?
...
Рейтинг: 0 / 0
Производительность запроса
    #37398274
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
haXbatОтчасти я не прав: исходил из того, что по умолчанию в приложении на клиенте строго проверяется вводимые даты на формат 'dd.mm.yyyy' перед выполнением запроса. Иначе какой смысл вообще выполнять запрос, если пользователь ввел в поле вместо корректной даты "10" или воообще "валера" ?
Не уверен как там с приоритетами, но он может вместо этого привести левую часть к to_char, отсюда потеря использования индекса.
...
Рейтинг: 0 / 0
Производительность запроса
    #37398275
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точнее вообще запрос начнет выполняться неверно
...
Рейтинг: 0 / 0
Производительность запроса
    #37398281
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvUserВидимо дело в большом количестве соединений и выбираемых данных.

Откуда видимо? Пока ничего не видно. ТС дал нам кусок текста запроса, причём кусок не из лучших. Ни полного запроса из результата отладки, ни трассировки его выполнения, ни объёмов данных, ни логики работы пользователя с отчётом - только "крушение... 37 градусов южной широты...".
SvUser1. По всем столбцам типа cr.ord_date добавить индекс.
Зачем? Давайте для начала определимся с запросом(ами), а потом будем искать проблемы с выполнением. Новые индексы могут не иметь смысла и добавить проблем.
SvUser3. Можно еще ради эксперимента попробовать заменить на:
decode( :P2_DATE_FILTER_TYPE, 1, cr.ord_date, 2, tt.arrival_date, ... ) between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy')
Думаю, мало что изменится.
...
Рейтинг: 0 / 0
Производительность запроса
    #37398298
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
suPPLerSvUserВидимо дело в большом количестве соединений и выбираемых данных.

Откуда видимо? Пока ничего не видно. ТС дал нам кусок текста запроса, причём кусок не из лучших. Ни полного запроса из результата отладки, ни трассировки его выполнения, ни объёмов данных, ни логики работы пользователя с отчётом - только "крушение... 37 градусов южной широты...".
SvUser1. По всем столбцам типа cr.ord_date добавить индекс.
Зачем? Давайте для начала определимся с запросом(ами), а потом будем искать проблемы с выполнением. Новые индексы могут не иметь смысла и добавить проблем.
SvUser3. Можно еще ради эксперимента попробовать заменить на:
decode( :P2_DATE_FILTER_TYPE, 1, cr.ord_date, 2, tt.arrival_date, ... ) between to_date(:P2_DATE_FROM, 'dd.mm.yyyy') and to_date(:P2_DATE_TO, 'dd.mm.yyyy')
Думаю, мало что изменится.
Это вероятные предположения и общие рекоммендации, и это лишь то с чем стоит поэкспериментировать на основе представленных данных. С остальным согласен, данных мало.
...
Рейтинг: 0 / 0
Производительность запроса
    #37398322
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
haXbatИначе какой смысл вообще выполнять запрос, если пользователь ввел в поле вместо корректной даты "10" или воообще "валера" ?

А что такое "корректная дата"? '01-Jan-11' - это корректная дата? :) Всё зависит от явного формата, указанного в атрибутах поля, и формата по умолчанию, который будет использоваться при отсутствии в to_date / to_char.
SvUser4. Создание Dynamic IR http://www.oracleapplicationexpress.com/tutorials/71
Ссылка показывает работу с коллекциями, но на этом не останавливается. Главное, чтобы ТС вовремя остановился...

Alexggg99 , включите Debug на своей странице с отчётом, возьмите запрос со всеми обёртками APEX и покажите его нам. Отключите Debug, выполните трассировку . В трассе должен быть план выполнения. Мне кажется, среди шагов в этом плане будет MERGE JOIN CARTESIAN. Но лучше не гадать, а увидеть.

Можете обратиться с запросом и планом в основной форум Oracle . Там Вам подкинут идей.

И откажитесь от идеи универсального запроса, ищущего события за период по куче таблиц с датами, которые ещё и соединяются между собой. Используйте несколько запросов (через фильтры и сохранённые отчёты, через процесс и коллекции). Или используйте одну таблицу-журнал, регистрирующую события по сущности (заказ, отправление, ГТД, финансовые расчёты), возможно - материализованное представление; по этому журналу и ищите, а затем выводите всё нужное.
...
Рейтинг: 0 / 0
Производительность запроса
    #37398502
haXbat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLerА что такое "корректная дата"? '01-Jan-11' - это корректная дата? :)
Вот вам истина последней инстанции ). И да, с точки зрения сферической тети Гали из бухгалтерии дата в формате '01-Jan-11' - это просто уму непостижимо! В силах разработчика спасти несчастную тетю Галю, позволяя ей вводить даты исключительно в православном формате ДД.ММ.ГГГГ
...
Рейтинг: 0 / 0
Производительность запроса
    #37398550
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
haXbatВот вам истина последней инстанции ).

Тёма, может быть, и хороший дизайнер, но апеллировать к нему здесь - недальновидно. Разработчик приложений APEX, Oracle и вообще БД из него, как из меня балерина.

Во-первых, помните, что удобство использования (usability) и эстетическая красота - величины обратно зависимые. Тёте Гале удобно видеть вначале год, потом месяц, а затем число, а традиции русской типографики (Вы на них ссылаетесь, кстати) и размышления о них матерщинника Татьяныча её не волнуют. Тётя Оля поддерживает её и хочет видеть в поле "Месяц отчётности" значение "Январь 2009", а не "01.01.2009". Если им так работать удобно , и они работу делают за счёт этого быстрее - я их мнение разделяю полностью. Потому что считаю, что в случае конфликта удобство пользователя важнее красоты.

Во-вторых, не указывая явно to_date() и формат, Вы перекладываете эту работу на Oracle. Который пытается преобразовать Вашу строку в дату, используя NLS_DATE_FORMAT и правила преобразования. И у него может получиться. А может и нет. А может и вовсе каша выйти. Не стоит оставлять такие вещи на волю случая, лучше явно указывать to_date и формат. Возможно, в 4.1 этот момент наконец-то изменится, и к переменным, представляющим собой Date Picker, будут привязываться значения-даты с учётом формата из соответствующего атрибута.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Производительность запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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