Powinieneś odświeżyć widok w wyzwalaczach po wstawieniu/aktualizacji/usunięciu/obcięcie dla każdej instrukcji w table1
i 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();
W ten sposób Twój zmaterializowany widok jest zawsze aktualny. To proste rozwiązanie może być trudne do zaakceptowania przy częstych wstawkach/aktualizacjach i sporadycznych wyborach. W Twoim przypadku (rzadko zmiany około dwa razy dziennie) idealnie pasuje do Twoich potrzeb.
Aby zrealizować odroczone odświeżanie zmaterializowanego widoku potrzebujesz jednej z następujących funkcji:
- asynchroniczny wyzwalacz
- uruchom przed wybraniem
- zasada wyboru przed
Postgres ich nie ma, więc wydaje się, że nie ma jasnych rozwiązanie postgres.
Biorąc to pod uwagę, rozważyłbym funkcję opakowującą dla zaznaczeń na mat_view, np.
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;
To, czy jest to akceptowalne w praktyce, zależy od szczegółów, o których nie wiem.