Я не думаю, что имеет смысл запускать триггер для обновления ...
Весь смысл триггера + MQT состоит в том, чтобы триггер напрямую обновлял таблицу MQT. Таким образом, вам нужно иметь дело только с точными строками, которые изменились; вместо того, чтобы заставлять БД снова читать всю базовую таблицу.
create or replace trigger test_aus
after update on test
referencing
new row as n
old row as o
for each row
mode db2sql
begin atomic
if n.a <> o.a then
update test_mqt set cnt = cnt + n.a - o.a;
end if;
end@
Но учтите, что если изменение в a
- это все, что вас интересует, то вы можете определить триггер как
after update of a on test
for each row
таким образом, триггер сработает только в том случае, если a действительно обновлено.
Если за один раз выполняются обновления SQL, а не однострочных обновлений RPG (или SQL), то, возможно, будет полезен триггер оператора ...
Примерно так:
create or replace trigger test_aus
after update on test
referencing
new table as n
old table as o
for each statement
mode db2sql
begin atomic
update test_mqt
set cnt = cnt + (select sum(n.a - o.a)
from N join O using(id)
where n.a <> o.a
);
end@
Редактировать: Альтернатива MQT
На самом деле я никогда не использовал MQT в производстве, поскольку IBM I не поддерживает системные MQT.
В сценарии, в котором вы заинтересованы в обновленном агрегате, кодированные векторные индексы (EVI) с включенными агрегатами могут обеспечить лучшее решение; так как они поддерживаются автоматически.
CREATE ENCODED VECTOR INDEX sales_fact_location_id_evi
ON sales_fact(sale_location_id ASC)
INCLUDE(SUM(sale_amount_measure))
Приведенный выше пример взят из статьи Ускоренная аналитика - более быстрые агрегации с использованием технологии кодированного векторного индекса (EVI) IBM DB2 for i . Это хорошая статья, которая сравнивает EVI с MQT для хранения агрегатов.