|
Разбор тормозов в IR.
|
|||
---|---|---|---|
#18+
Столкнулся со странной проблемой, когда разбирался почему тормозит 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.
Т.е. якобы на бинд переменной 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 секунды. Есть у кого-нибудь идеи, что почему такое происходит и как исправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2018, 12:17 |
|
Разбор тормозов в IR.
|
|||
---|---|---|---|
#18+
mrsergej, А в plsql девелопере ты все строки получил по запросу или только первые? попробуй добавить в первоначальный запрос сортировку или какую нибудь аналитическую функцию, чтобы все строки сервер вернул. Думаю ответ будет как и ожидаемо все те же 12 секунд ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2018, 12:39 |
|
Разбор тормозов в IR.
|
|||
---|---|---|---|
#18+
Nickname, Само собой я отфетчил все записи ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2018, 12:40 |
|
Разбор тормозов в IR.
|
|||
---|---|---|---|
#18+
mrsergej, Планы запросов сравнивайте или трассировки ( см. &p_trace=YES в апексе ) План поехать может по разным причинам, та же замена bind переменных на константы может вести к разным планам и разному времени выполнения как следствие. Дебаг в данном месте криво немного написан, т.к. время, очевидно, потрачено не на связывание, а на исполнение. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2018, 10:21 |
|
Разбор тормозов в IR.
|
|||
---|---|---|---|
#18+
Сегодня опять добрался до данного вопроса. И действительно посмотрев на планы запросов увидел, что в случае с использованием DBMS_SQL план запроса немного отличается - я получаю full к одной таблице. Запрос делается из представления с кучей юнионов по дате. Запрос мой в апексе выглядит следующим образом: Код: plsql 1. 2. 3.
и тут интересно вот что, в плане такого запроса я получаю FULL к одной из таблиц представления и соответственно запрос выполняется долго. Если вместо переменной :P3_DATE явно указать значение, например, написать Код: plsql 1.
, то дата проталкивается внутрь и по всем таблицам представления используются индексы по дате. Вот как-то так, теперь думаю как лучше решить данную проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2018, 11:18 |
|
Разбор тормозов в IR.
|
|||
---|---|---|---|
#18+
mrsergej, Например, может столбец не селективный, или статистика старая. Хинт INDEX посмотрите. Вообще, вопросы по оптимизации, в соседний раздел. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2018, 14:05 |
|
Разбор тормозов в IR.
|
|||
---|---|---|---|
#18+
Теперь, я понимаю, что тема не по апексу в итоге вышла. Но вот что я в итоге нарыл. Про хинты индекс я их сразу воткнул, как только увидел full к таблице. Но теперь проблема более или менее сузилась: в представлении был юнион с другой вьюшкой, которая всё портила. Проблемная вьюшка сделана на инмемори таблице с анпивотом и группировками. Путём экспериментов выяснилось, что если запрос к этой таблице делать через dbms_sql, где я биндил один обязательный параметр - дату и несколько необязательных, то запрос выполняется очень долго около 11 сек против 1-2с в обычном случае. Так вот когда я биндю одну обязательную переменную, то запрос выполняется быстро, но как только появляется хоть одна другая переменная - запрос выполняется долго. Кто что может подсказать куда копать? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2018, 15:19 |
|
Разбор тормозов в IR.
|
|||
---|---|---|---|
#18+
Дальше больше теперь нашёл проблему ещё более чётко. Во фразе where используется думаю, знакомая многим апексоводам конструкция, наподобии Код: plsql 1. 2. 3.
, так вот если писать не так, а так Код: plsql 1.
, то запрос выполняется так как нужно. Сдаётся мне, что он перебирает все данные в столбцах, вместо того, чтобы ограничить их по обязательному условию Код: plsql 1.
а затем уже внутри него ограничивать остальные столбцы. Или инмемори так не работают как я ожидал? Какие будут предложения? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2018, 15:50 |
|
Разбор тормозов в IR.
|
|||
---|---|---|---|
#18+
mrsergej, Меняется стоимость, меняется план. Там много технологий, которые влияют на стоимость и на выбор плана (cursor sharing, bind aware, cardinality, гистограммы и т.д.) Здесь нет связи с апексом. Обратитесь в другой раздел. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2018, 16:14 |
|
|
start [/forum/topic.php?fid=50&fpage=11&tid=1874169]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 306ms |
total: | 440ms |
0 / 0 |