Автоматический пересчёт актуального сальдо

Last modified by Nefedenkova Viktoria on 2020/11/12 17:01

Вернуться назад: Для администраторов, внедренцев, разработчиков

1. Цель автоматического пересчёта (АП) актуального сальдо (АС)

Механизм АС основан на заполнении промежуточных буферных таблиц (TXSLD, TSLD) из триггера tmdb_cm_tsld_tr при работе с проводками. Т.к. при этом данные только добавляются в буферные таблицы, то объём данных в TXSLD/TSLD постоянно растёт. Через некоторе время объём данных в этих таблицах вырастет настолько, что потеряется сам смысл актуального сальдо (быстрый расчёт/получение остатков). Автоматический пересчёт АС предназначен для ежедневного перезаполнения используемых таблиц с целью уменьшения объёма данных, который необходимо обрабатывать для расчёта/получения остатков.

2. Описание процедуры АП

При выполнении АП призводится последовательное перезаполнение таблиц TSLD и TXSLD (вызов un$sld.rebuild). Перед запуском пересчёта выполняется попытка эксклюзивной блокировки целевой таблицы. После блокировки никакие другие сессии не могут изменять данные в таблице (только читать), поэтому на время пересчта блокируется работа с проводками.
Если АП  выполняется в период с 0 до 6-ти часов, то производится не только пересчёт АС, но и усечение до минимума размеров буферных таблиц при помощи truncate. Т.к. при выполнении truncate производится неявный commit, то процедура пересчёта производится не в рамках одной транзакции, и  данные становятся недоступными (таблица полностью очищена) для других сессий до завершения АП.
Поскольку процедура АП предусматривалась для работы в рамках фонового задания (job), то, по умолчанию, возникающие ошибки не распространяются за пределы процедуры. Иначе после 16-ти ошибок job бы прекратил работу, если не предусмотреть обработку исключений в самом job’e. Работа процедуры АП и ошибки, которые могут возникнуть в процессе работы, логируются.
Для исключения параллельного запуска в процедуре АП предусмотрено создание уникальной пользовательской блокироки при помощи dbms_lock.

3. Время запуска процедуры АП

При пересчёте АС создаётся дополнительная нагрузка на сервер, блокируется работа с проводками, а также возможна временная очистка данных буферных таблиц (при truncate). Поэтому рекомендуемое время запуска АП для большинства клиентов – с 0 до 6-ти часов. Если в период с 0 до 6 возможна работа пользователей на сервере, то необходимо выбрать другое удобное для пересчёта время или вносить изменения в процедуру АП.
В особых случаях (например, при круглосуточной работе пользователей с БД) вместо/кроме полного пересчёта возможно использование частичного сжатия данных буферных таблиц при помощи un$sld.compact. Такая процедура даёт меньший эффект, но имеет и меньше ограничений. Частичное сжатие может выполняться в более широком интервале времени, но в рамках данной инструкции не рассматривается.

4. Установка и настройка

Процедура АП АС реализована в пакете 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 вручную. Проверить наличие задания на пересчёт можно следующим запросом:

select * from user_jobs where lower(what) like '%pkg_sld_util.rebuild_sld_actual%'.

5. Мониторинг и диагностика

Логи работы АП и возникавшие в процессе работы ошибки, например, за последние 5 дней, можно посмотреть следующим запросом:

select * from xprocess_log
where process_id = (select process_id from xprocess_list where process_name = 'SaldoRebuild')
  and log_date > trunc(sysdate)-5
order by id desc
По таблице xprocess_log создан индекс по полю log_date для ускорения запросов по определённой дате или интервалу дат.
Для просмотра лога в более удобном виде можно воспользоваться специализированной формой «Лог процессов», входящей в группу форм «Системные» (M:\STD\XML\Forms\FG_System.xml). В этой же группе можно найти форму «Блокировки». При выборе в данной форме типа «Блокировки пересчёта актуального сальдо» можно увидеть список сессий, которые на данный момент удержвают блокировки на TSLD/TXSLD и будут блокировать работу АП, если запустить пересчёт. Тот же список получить запросом

select * from unv$lock where object_name in ('TXSLD','TSLD').

Например:

truncate table txsld drop storage;
truncate table tsld drop storage;

begin
  pkg_sld_util.rebuild_sld_actual;
end;
/

begin
  pkg_sld_util.make_rebuild_job(p_hours => 4);
end;
/