Гость
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Производительность запроса / 16 сообщений из 16, страница 1 из 1
16.08.2011, 16:39
    #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
16.08.2011, 17:15
    #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
16.08.2011, 17:18
    #37398183
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса
Alexggg99,

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

Дело в том что я использую Interective Report там как это проделать??
...
Рейтинг: 0 / 0
16.08.2011, 17:38
    #37398219
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса
haXbatПреобразования to_date в where тоже лишние.
Вы уверены?
...
Рейтинг: 0 / 0
16.08.2011, 17:41
    #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
16.08.2011, 17:50
    #37398247
Alexggg99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса
SvUser,
Не получается запихать
PL/SQL function body returning SQL query в Source
есть ещё какой нибудь способ. Запрос действительно соединяет много таблиц (40 таблиц) и на входе у него много переменных параметров.
...
Рейтинг: 0 / 0
16.08.2011, 17:56
    #37398256
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса
Alexggg99SvUser,
Не получается запихать
PL/SQL function body returning SQL query в Source
так и не надо, см. решение по ссылке.

Alexggg99есть ещё какой нибудь способ. Запрос действительно соединяет много таблиц (40 таблиц) и на входе у него много переменных параметров.
как я уже сказал, оптимизировать на выборку первых записей или менять подходы к организации фильтров.
...
Рейтинг: 0 / 0
16.08.2011, 18:01
    #37398267
haXbat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса
suPPLerВы уверены?
Отчасти я не прав: исходил из того, что по умолчанию в приложении на клиенте строго проверяется вводимые даты на формат 'dd.mm.yyyy' перед выполнением запроса. Иначе какой смысл вообще выполнять запрос, если пользователь ввел в поле вместо корректной даты "10" или воообще "валера" ?
...
Рейтинг: 0 / 0
16.08.2011, 18:04
    #37398274
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса
haXbatОтчасти я не прав: исходил из того, что по умолчанию в приложении на клиенте строго проверяется вводимые даты на формат 'dd.mm.yyyy' перед выполнением запроса. Иначе какой смысл вообще выполнять запрос, если пользователь ввел в поле вместо корректной даты "10" или воообще "валера" ?
Не уверен как там с приоритетами, но он может вместо этого привести левую часть к to_char, отсюда потеря использования индекса.
...
Рейтинг: 0 / 0
16.08.2011, 18:04
    #37398275
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса
точнее вообще запрос начнет выполняться неверно
...
Рейтинг: 0 / 0
16.08.2011, 18:06
    #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
16.08.2011, 18:16
    #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
16.08.2011, 18:34
    #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
16.08.2011, 21:23
    #37398502
haXbat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса
suPPLerА что такое "корректная дата"? '01-Jan-11' - это корректная дата? :)
Вот вам истина последней инстанции ). И да, с точки зрения сферической тети Гали из бухгалтерии дата в формате '01-Jan-11' - это просто уму непостижимо! В силах разработчика спасти несчастную тетю Галю, позволяя ей вводить даты исключительно в православном формате ДД.ММ.ГГГГ
...
Рейтинг: 0 / 0
16.08.2011, 22:11
    #37398550
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса
haXbatВот вам истина последней инстанции ).

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

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

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


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