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();
このようにして、マテリアライズド・ビューは常に最新です。この単純な解決策は、頻繁な挿入/更新や散発的な選択では受け入れがたい場合があります。あなたの場合(1日に2回程度変更されることはめったにありません)、理想的にはニーズに適合します。
遅延更新を実現するには マテリアライズドビューの場合、次のいずれかの機能が必要です。
- 非同期トリガー
- 選択する前にトリガーする
- 前に選択するルール
Postgresにはそれらがないため、明確なはないようです。 postgresソリューション。
これを考慮して、mat_viewでのselectのラッパー関数を検討します。例:
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;
それが実際に受け入れられるかどうかは、私が知らない詳細に依存します。