Make your own free website on Tripod.com

Объектно-реляционная БД Ultima-S

Концепция триггера накопления статистики суммирующего плана

В MS SQL триггер является идеальным средством организации статистических таблиц суммирующего плана типа Saldo. Дело в том, что триггер получает в оптимальном виде дельту для данных по которым ведет статистику и сразу может поправить данные статистической таблице ровно на дельту без излишних пересчетов.

Рассмотрим простой пример такого механизма.

Как уже отмечалось, проводка в Ultima-S содержит целую таблицу аналитик с суммами. Поэтому когда интересен вопрос какова сумма по такой составной проводке без учета аналитик, то выгодно иметь кеш следующего плана:

CREATE TABLE dbo.ComplectInfo (

UDN int NOT NULL , -- Проводка

sum_s money NULL , -- Общая сумма по проводке без учета аналитик

)

Такой кеш дествительно существовал некоторое время в Ultima-S, пока не стало ясно что фактически все запросы требуют раскрытия сумм в аналитиках. Тем не менее, пример этого кеша прост для понимания. Приведем текст триггера поддерживающего данный кеш.

CREATE TRIGGER ComplectInformator

ON Complect

FOR INSERT, UPDATE, DELETE

as

insert ComplectInfo(UDN, sum_s)

select distinct inserted.UDN, 0 from inserted

where not exists (

select inserted.UDN

from ComplectInfo where ComplectInfo.UDN=inserted.UDN)

 

update ComplectInfo

set ComplectInfo.sum_s=ComplectInfo.sum_s+(

select sum(inserted.s) from inserted

where inserted.UDN=ComplectInfo.UDN)

where exists (

select distinct ComplectInfo.UDN

from inserted where ComplectInfo.UDN=inserted.UDN)

 

update ComplectInfo

set ComplectInfo.sum_s=ComplectInfo.sum_s-

(select sum(deleted.s) from deleted where deleted.UDN=ComplectInfo.UDN)

where exists(

select distinct ComplectInfo.UDN from deleted

where deleted.UDN=ComplectInfo.UDN)

GO