Du bör uppdatera vyn i triggers efter infoga/uppdatera/delete/truncate för varje sats på table1
och 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();
På så sätt är din materialiserade vy alltid uppdaterad. Denna enkla lösning kan vara svår att acceptera med frekventa inlägg/uppdateringar och sporadiska val. I ditt fall (byter sällan ungefär två gånger om dagen) passar den perfekt dina behov.
För att realisera uppskjuten uppdatering av en materialiserad vy behöver du en av följande funktioner:
- asynkron utlösare
- utlösare innan du väljer
- regera på välj innan
Postgres har ingen av dem, så det verkar som om det inte finns någon tydlig postgres lösning.
Med hänsyn till detta skulle jag överväga en omslagsfunktion för markeringar på mat_view, t.ex.
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;
Om det är acceptabelt i praktiken beror på detaljer som jag inte känner till.