powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Разбор тормозов в IR.
9 сообщений из 9, страница 1 из 1
Разбор тормозов в IR.
    #39623191
mrsergej
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся со странной проблемой, когда разбирался почему тормозит IR отчёт.
Возможно, даже проблема, не связана с apex'ом. Итак апекс 5.1.4.00.08, ords 17.4.1.353.06.48
(standalone + nginx), oracle EE 12.2.0.1. Запустил в апексе дебаг, который показал мне следующую
странную строчку:
Код: html
1.
2.
3.
4.
5.
6.
0,15712	0,00008	IR binding: "P3_TABLE" value=""	4	0%
0,15719	0,00011	Session State: P3_TABLE=>	4	0%
0,1573	0,00006	... do not save: same value / password / no session	4	0%
[color=red]0,15736	12,01097	IR binding: "APXWS_MAX_ROW_CNT" value="1000000"	4	98%[/color]
12,16833	0,00038	Printing rows.  Row window: 1-50.  Rows found: 1	4	0%
12,16871	0,00009	g_worksheet_attribues.show_download: Y CSV:HTML:EMAIL:XLS:PDF:RTF	4	0%



Т.е. якобы на бинд переменной APXWS_MAX_ROW_CNT он потратил 12 секунд, когда запрос в plsql девелопере
выполняется за 4 секунды. Это мне показалось очень странным. Дальше из представления apex_application_page_regions
выдернул текст запроса, затем с помощью apex_ir.get_report получил коллекцию с переменными и их значениями.

И вот теперь САМОЕ интересное: решил через dbms_sql выполнить данный запрос, обернув сверху надзапросом с
агрегатной функцией sum, просто чтобы была в итоге одна запись и запрос также повис на теже 12 секунд на fetch_rows.

Когда переписал запрос без dbms_sql на execute immediate без using с указанием явных литералов, то он выполнился
как и ожидалось за 2-3 секунды.

Есть у кого-нибудь идеи, что почему такое происходит и как исправить?
...
Рейтинг: 0 / 0
Разбор тормозов в IR.
    #39623213
Nickname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mrsergej,

А в plsql девелопере ты все строки получил по запросу или только первые?
попробуй добавить в первоначальный запрос сортировку или какую нибудь аналитическую функцию, чтобы все строки сервер вернул.
Думаю ответ будет как и ожидаемо все те же 12 секунд
...
Рейтинг: 0 / 0
Разбор тормозов в IR.
    #39623215
mrsergej
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nickname,

Само собой я отфетчил все записи
...
Рейтинг: 0 / 0
Разбор тормозов в IR.
    #39624044
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrsergej,

Планы запросов сравнивайте или трассировки ( см. &p_trace=YES в апексе )
План поехать может по разным причинам, та же замена bind переменных на константы может вести к разным планам и разному времени выполнения как следствие.

Дебаг в данном месте криво немного написан, т.к. время, очевидно, потрачено не на связывание, а на исполнение.
...
Рейтинг: 0 / 0
Разбор тормозов в IR.
    #39627423
mrsergej
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сегодня опять добрался до данного вопроса.

И действительно посмотрев на планы запросов увидел, что в случае с
использованием DBMS_SQL план запроса немного отличается - я получаю
full к одной таблице. Запрос делается из представления с кучей юнионов по
дате.

Запрос мой в апексе выглядит следующим образом:
Код: plsql
1.
2.
3.
SELECT ДАТА, ПОЛЕ1, ПОЛЕ2 ...
   FROM ВЬЮ_С_КУЧЕЙ_ЮНИОНОВ В
 WHERE В.ДАТА = TO_DATE(:P3_DATE, 'DD.MM.YYYY')



и тут интересно вот что, в плане такого запроса я получаю FULL к одной
из таблиц представления и соответственно запрос выполняется долго.
Если вместо переменной :P3_DATE явно указать значение, например,
написать
Код: plsql
1.
WHERE В.ДАТА = TO_DATE('01.03.2018', 'DD.MM.YYYY')


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

Вот как-то так, теперь думаю как лучше решить данную проблему.
...
Рейтинг: 0 / 0
Разбор тормозов в IR.
    #39627527
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrsergej,

Например, может столбец не селективный, или статистика старая.
Хинт INDEX посмотрите.
Вообще, вопросы по оптимизации, в соседний раздел.
...
Рейтинг: 0 / 0
Разбор тормозов в IR.
    #39627565
mrsergej
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь, я понимаю, что тема не по апексу в итоге вышла.

Но вот что я в итоге нарыл. Про хинты индекс я их сразу воткнул, как только увидел full к таблице.

Но теперь проблема более или менее сузилась: в представлении был юнион с другой вьюшкой, которая
всё портила. Проблемная вьюшка сделана на инмемори таблице с анпивотом и группировками. Путём
экспериментов выяснилось, что если запрос к этой таблице делать через dbms_sql, где я биндил один
обязательный параметр - дату и несколько необязательных, то запрос выполняется очень долго около
11 сек против 1-2с в обычном случае. Так вот когда я биндю одну обязательную переменную, то запрос
выполняется быстро, но как только появляется хоть одна другая переменная - запрос выполняется долго.

Кто что может подсказать куда копать?
...
Рейтинг: 0 / 0
Разбор тормозов в IR.
    #39627585
mrsergej
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дальше больше теперь нашёл проблему ещё более чётко.

Во фразе where используется думаю, знакомая многим апексоводам конструкция, наподобии
Код: plsql
1.
2.
3.
AND (:P3_CLI_ACC IS NULL 
   OR  ДК.CLI_ACC_CODE LIKE '%' || :P3_CLI_ACC || '%'
)


, так вот если писать не так, а так
Код: plsql
1.
AND ДК.CLI_ACC_CODE LIKE '%' || :P3_CLI_ACC || '%'


, то запрос выполняется так как нужно. Сдаётся мне, что он перебирает все данные в столбцах,
вместо того, чтобы ограничить их по обязательному условию
Код: plsql
1.
 WHERE В.ДАТА = TO_DATE(:P3_DATE, 'DD.MM.YYYY')


а затем уже внутри него ограничивать остальные столбцы.

Или инмемори так не работают как я ожидал? Какие будут предложения?
...
Рейтинг: 0 / 0
Разбор тормозов в IR.
    #39627596
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrsergej,

Меняется стоимость, меняется план.
Там много технологий, которые влияют на стоимость и на выбор плана (cursor sharing, bind aware, cardinality, гистограммы и т.д.)
Здесь нет связи с апексом.
Обратитесь в другой раздел.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Разбор тормозов в IR.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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