Wiki source code of Автоматический пересчёт актуального сальдо
Last modified by Nefedenkova Viktoria on 2020/11/12 17:01
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | {{box cssClass="floatinginfobox" title="**Содержание**"}} | ||
| 2 | {{toc/}} | ||
| 3 | {{/box}} | ||
| 4 | |||
| 5 | ^^Вернуться назад: [[Для администраторов, внедренцев, разработчиков>>http://xwiki.una.md/bin/view/UNA/Una4_Admins||class="undefined"]]^^ | ||
| 6 | |||
| 7 | = 1. Цель автоматического пересчёта (АП) актуального сальдо (АС) = | ||
| 8 | |||
| 9 | Механизм АС основан на заполнении промежуточных буферных таблиц (TXSLD, TSLD) из триггера tmdb_cm_tsld_tr при работе с проводками. Т.к. при этом данные только добавляются в буферные таблицы, то объём данных в TXSLD/TSLD постоянно растёт. Через некоторе время объём данных в этих таблицах вырастет настолько, что потеряется сам смысл актуального сальдо (быстрый расчёт/получение остатков). Автоматический пересчёт АС предназначен для ежедневного перезаполнения используемых таблиц с целью уменьшения объёма данных, который необходимо обрабатывать для расчёта/получения остатков. | ||
| 10 | |||
| 11 | = 2. Описание процедуры АП = | ||
| 12 | |||
| 13 | При выполнении АП призводится последовательное перезаполнение таблиц TSLD и TXSLD (вызов un$sld.rebuild). Перед запуском пересчёта выполняется попытка эксклюзивной блокировки целевой таблицы. После блокировки никакие другие сессии не могут изменять данные в таблице (только читать), поэтому на время пересчта блокируется работа с проводками. | ||
| 14 | Если АП выполняется в период с 0 до 6-ти часов, то производится не только пересчёт АС, но и усечение до минимума размеров буферных таблиц при помощи truncate. Т.к. при выполнении truncate производится неявный commit, то процедура пересчёта производится не в рамках одной транзакции, и данные становятся недоступными (таблица полностью очищена) для других сессий до завершения АП. | ||
| 15 | Поскольку процедура АП предусматривалась для работы в рамках фонового задания (job), то, по умолчанию, возникающие ошибки не распространяются за пределы процедуры. Иначе после 16-ти ошибок job бы прекратил работу, если не предусмотреть обработку исключений в самом job’e. Работа процедуры АП и ошибки, которые могут возникнуть в процессе работы, логируются. | ||
| 16 | Для исключения параллельного запуска в процедуре АП предусмотрено создание уникальной пользовательской блокироки при помощи dbms_lock. | ||
| 17 | |||
| 18 | = 3. Время запуска процедуры АП = | ||
| 19 | |||
| 20 | При пересчёте АС создаётся дополнительная нагрузка на сервер, блокируется работа с проводками, а также возможна временная очистка данных буферных таблиц (при truncate). Поэтому рекомендуемое время запуска АП для большинства клиентов – с 0 до 6-ти часов. Если в период с 0 до 6 возможна работа пользователей на сервере, то необходимо выбрать другое удобное для пересчёта время или вносить изменения в процедуру АП. | ||
| 21 | В особых случаях (например, при круглосуточной работе пользователей с БД) вместо/кроме полного пересчёта возможно использование частичного сжатия данных буферных таблиц при помощи un$sld.compact. Такая процедура даёт меньший эффект, но имеет и меньше ограничений. Частичное сжатие может выполняться в более широком интервале времени, но в рамках данной инструкции не рассматривается. | ||
| 22 | |||
| 23 | = 4. Установка и настройка = | ||
| 24 | |||
| 25 | Процедура АП АС реализована в пакете pkg_sld_util (pkg_sld_util.rebuild_sld_actual). Все необходимые для установки данного пакеты объекты включены в стукруру стандартной схемы начиная с 28.12.2009 и могут быть установлены в процессе полного обновления или выборочно. После создания пакета можно использовать его для создания автоматического фонового задания (job) для ежедневного пересчёта АС. Для этого необходимо вызвать процедуру pkg_sld_util.make_rebuild_job. По умолчанию создаётся ежедневное задание с временем запуска в 3:00. Можно указать и другое время (час суток) – параметр p_hours, но при попытке указать время вне интервала 0-6 часов при первом вызове процедуры будет выдано предупреждение. Более сложное расписание можно задать, создав job вручную. Проверить наличие задания на пересчёт можно следующим запросом: | ||
| 26 | |||
| 27 | (% style="font-size: 14px; font-family: Consolas; background-color:#fbfdff" %) | ||
| 28 | select * from user_jobs where lower(what) like '%pkg_sld_util.rebuild_sld_actual%'. | ||
| 29 | |||
| 30 | = 5. Мониторинг и диагностика = | ||
| 31 | |||
| 32 | Логи работы АП и возникавшие в процессе работы ошибки, например, за последние 5 дней, можно посмотреть следующим запросом: | ||
| 33 | |||
| 34 | (% style="font-size: 14px; font-family: Consolas; background-color:#fbfdff" %) | ||
| 35 | select * from xprocess_log | ||
| 36 | where process_id = (select process_id from xprocess_list where process_name = 'SaldoRebuild') | ||
| 37 | and log_date > trunc(sysdate)-5 | ||
| 38 | order by id desc | ||
| 39 | По таблице xprocess_log создан индекс по полю log_date для ускорения запросов по определённой дате или интервалу дат. | ||
| 40 | Для просмотра лога в более удобном виде можно воспользоваться специализированной формой «Лог процессов», входящей в группу форм «Системные» (M:\STD\XML\Forms\FG_System.xml). В этой же группе можно найти форму «Блокировки». При выборе в данной форме типа «Блокировки пересчёта актуального сальдо» можно увидеть список сессий, которые на данный момент удержвают блокировки на TSLD/TXSLD и будут блокировать работу АП, если запустить пересчёт. Тот же список получить запросом | ||
| 41 | |||
| 42 | select * from unv$lock where object_name in ('TXSLD','TSLD'). | ||
| 43 | |||
| 44 | Например: | ||
| 45 | |||
| 46 | (% style="font-size: 14px; font-family: Consolas; background-color:#fbfdff" %) | ||
| 47 | {{{truncate table txsld drop storage; | ||
| 48 | truncate table tsld drop storage; | ||
| 49 | |||
| 50 | begin | ||
| 51 | pkg_sld_util.rebuild_sld_actual; | ||
| 52 | end; | ||
| 53 | / | ||
| 54 | |||
| 55 | begin | ||
| 56 | pkg_sld_util.make_rebuild_job(p_hours => 4); | ||
| 57 | end; | ||
| 58 | /}}} |