|
|
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, обращаюсь за советом по следующему вопросу: есть некоторая джоба, которая запускает хранимую процедуру, в которой выполняются некоторые действия в цикле, затем запускается рефреш материализованного представления с помощью DBMS_MVIEW. Проблема заключается в том, что система испытывает просадки производительности, и при определенных обстоятельствах рефреш матвью может вылиться в длительное ожидание его завершения и тормоза. В связи с этим, хотелось бы иметь возможность остановить рефреш по истечении определенного промежутка времени, главным условием должно быть то, что процедура, в которой выполняется рефреш, должна прекратить свою работу по истечению отведенного времени, вплоть до прихлопывания оракловой сессии. Пока видется два решения: либо каким-то образом периодически проверять сколько по времени уже выполняется процедура, в которой запускается рефреш, либо как-то ограничить сам рефреш по времени. Но конкретной реализации, к сожалению, нет. Хотелось бы услышать ваши мнения по этому вопросу. И еще небольшой вопрос: какой на ваш взгляд необходимый минимум навыков оптимизации для программиста Оракл? Если что, версия Oracle DB 11.2. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2017, 12:01 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
Влюленные в обновление матвью часов не наблюдат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2017, 13:00 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
Tesamid, Вам оно виднее, понятное дело, однако странно получится: если не успели обновить, то придётся откатить ВСЮ транзакцию, что может превысить уже потраченное время. Если промежуточный коммит, то данные в раскоряку встанут, опять же транзакционность нарушите. Решите с админим, может лучше ресурсы лимитировать для обновления. Ещё посмотрите: - на "Fast" (точнее инкрементальное, а не быстрое!) обновление, специфический режим и не доделанный имхо, НО работать с ним точно можно - что в атрибуте обновления атомик/не атомик, это влияет на доступность МВ во время обноврения и, соответственно, на время - можно ли отключить какие-то индексы ПЕРЕД обновлением, потом их перестроить быстрее обычно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2017, 13:34 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
Vladimir FilinTesamid, Вам оно виднее, понятное дело, однако странно получится: если не успели обновить, то придётся откатить ВСЮ транзакцию, что может превысить уже потраченное время. Если промежуточный коммит, то данные в раскоряку встанут, опять же транзакционность нарушите. Решите с админим, может лучше ресурсы лимитировать для обновления. Ещё посмотрите: - на "Fast" (точнее инкрементальное, а не быстрое!) обновление, специфический режим и не доделанный имхо, НО работать с ним точно можно - что в атрибуте обновления атомик/не атомик, это влияет на доступность МВ во время обноврения и, соответственно, на время - можно ли отключить какие-то индексы ПЕРЕД обновлением, потом их перестроить быстрее обычно Vladimir Filin, спасибо за ответ, согласен с вами, но бизнес требования таковы, что в первую очередь необходимо гарантировать установленное время выполнения процедуры. Да, есть промежуточные коммиты, но это опять же бизнес-логике не противоречит, откат не требуется. Матвьюху нет возможности привести к состоянию, когда будут выполнены все требования fast обновления. Сейчас рефреш запускается с atomic_refresh = true и перед обновлением удаляются индексы, затем заново создаются. Если выставить atomic_refresh = true как это может помочь прервать рефреш в определенный момент? В целом первостепенная задача, это остановить выполение процедуры, в которой в том числе выполняется рефреш. Увеличение производительности рефреша, на мой взгляд, не сможет точно гарантировать, что время выполнение процедуры не превысит заданного предела, т.к. он тоже может меняться. Может сделать костыль, создав джобу, которая периодически проверяет время существования определенной сессии и делает kill в случае, если время вышло? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2017, 15:21 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
а почему долго рефрешится? Внутри куча UDF-функций, куча подзапросов с линками, план плохой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2017, 15:37 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
andreymx, UDF-не используются вообще, сама матвью строится на вьюхе, в которой есть два тяжелых CTE, которые затем джойнятся в нескольких подзапросах, объединенных union all. Пока думал над вашим постом, пришла мысль по ее оптимизации, но опять же, это не окончательное решение. Задача в том, чтобы останавливать процедуру по заданному времени, в первой ее части, где есть итерация это уже сделано, а вот для рефреша решения нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2017, 16:37 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
Tesamidа вот для рефреша решения нет. Вам же уже писали - откат транзакции которая много чего поменяла - плохая идея. Хотя бы потому, что может вызвать еще большую нагрузку на сервер еще на дольше. :) В принципе все просто - почитайте про Resource manager . Он может даже то, что Вы просите. Хотя, возможно, Вам будет достаточно менее радикального метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2017, 11:14 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
TesamidМожет сделать костыль, создав джобу, которая периодически проверяет время существования определенной сессии и делает kill в случае, если время вышло? почитайте про DBMS_SCHEDULER.SET_ATTRIBUTE атрибут max_run_duration ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2017, 11:31 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
AlionaTesamidМожет сделать костыль, создав джобу, которая периодически проверяет время существования определенной сессии и делает kill в случае, если время вышло? почитайте про DBMS_SCHEDULER.SET_ATTRIBUTE атрибут max_run_durationа как потом проверить, отработало или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2017, 12:54 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
andreymxAlionaпропущено... почитайте про DBMS_SCHEDULER.SET_ATTRIBUTE атрибут max_run_durationа как потом проверить, отработало или нет? Не знаю, не пробовала, но подозреваю, что вот этот запрос может показать результат авторselect l.log_id "Log ID", to_char(l.log_date, 'yyyy/mm/dd hh24:mi:ss.ff tzh:tzm') "Log Date", L.operation "Operation", L.STATUS "Status", L.user_name "User Name", L.CLIENT_ID "Client ID", L.global_uid "Global UID", to_char(R.REQ_START_DATE, 'yyyy/mm/dd hh24:mi:ss.ff tzh:tzm') "Required Start Date", to_char(R.ACTUAL_START_DATE, 'yyyy/mm/dd hh24:mi:ss.ff tzh:tzm') "Actual Start Date", to_char(R.RUN_DURATION) "Run Duration", R.INSTANCE_ID "Instance ID", R.SESSION_ID "Session ID", R.SLAVE_PID "Slave PID", to_char(R.CPU_USED) "CPU Used", R.ADDITIONAL_INFO "Additional Info (Run)" from DBA_SCHEDULER_JOB_LOG L, DBA_SCHEDULER_JOB_RUN_DETAILS R where l.Owner = 'схема' and l.job_name = 'джоб_с_REFRESH' and l.log_id = r.log_id (+) order by 1 desc если атрибут придуман, значит, он кому-то нужет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2017, 13:18 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
Aliona, или через промежуточную табличку в конце писать признак завершения и коммитить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2017, 13:21 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
Tesamidсистема испытывает просадки производительностиКто на ком стоял? Система тормозит и долго матвью считается или матвью долго считается и вся система тормозит или только запросы к матвью тормозят во время рефреша? Tesamidнеобходимый минимум навыков оптимизацииНавык замера времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2017, 13:37 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
Остановить рефреш по таймеру - противоречит природе МВ. Не устраивает "долгий" рефреш - определите причину задержки. Если проблема в записи на диск (к примеру), то шаманить надо в эту сторну. А если просто раздражает, то замените вьюхой обыкновенной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2017, 14:37 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
Tesamid, если накапливается много записей, то фаст рефреш становится не очень, желательно делать почаще, но меньше объемом. Это из собственного опыта и поиска по форумам с похожими проблемами. Также, если не получается сделать из-за ограничений в одной матвью, можно сделать несколько, и на основе них делать нужную. Также в блогах находил, что люди вручную из матвью логов обновляют таблицы, обходя ограничения, но там много возни с очисткой и сохранением всего этого в консистентном состоянии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2017, 11:34 |
|
||
|
Ограничение по времени выполнения рефреша
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за ответы, приняли решение все-таки сделать костыль с прекращением сессии джобы рефрешащей матвью. Менеджер ресурсов нет возможности использовать, т.к., если не ошибаюсь, он настраивается на уровне схемы, а ограничение ресурсов должно быть индивидуальным для каждой сессии данного пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2017, 11:50 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39521058&tid=1885200]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 477ms |

| 0 / 0 |
