Трябва да опресните изгледа в тригери след вмъкване/актуализиране/изтриване/отрязване за всеки израз в table1
и table2
.
create or replace function refresh_mat_view()
returns trigger language plpgsql
as $$
begin
refresh materialized view mat_view;
return null;
end $$;
create trigger refresh_mat_view
after insert or update or delete or truncate
on table1 for each statement
execute procedure refresh_mat_view();
create trigger refresh_mat_view
after insert or update or delete or truncate
on table2 for each statement
execute procedure refresh_mat_view();
По този начин вашият материализиран изглед е винаги актуален. Това просто решение може да е трудно за прием с чести вмъквания/актуализации и спорадични избори. Във вашия случай (рядко се променя около два пъти на ден) то идеално отговаря на вашите нужди.
За да реализирате отложено опресняване от материализиран изглед се нуждаете от една от следните функции:
- асинхронен тригер
- задействайте преди избор
- правило за избор преди
Postgres няма нито един от тях, така че изглежда, че няма изчистен postgres решение.
Като се има предвид това, бих помислил за функция за обвивка за избрани в mat_view, напр.
CREATE OR REPLACE FUNCTION select_from_mat_view(where_clause text)
RETURNS SETOF mat_view AS $body$
BEGIN
-- here is checking whether to refresh the mat_view
-- then return the select:
RETURN QUERY EXECUTE FORMAT ('SELECT * FROM mat_view %s', where_clause);
END;
$body$ LANGUAGE plpgsql;
Дали е приемливо на практика зависи от подробности, за които не знам.