PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Actualiser automatiquement une vue matérialisée à l'aide d'une règle ou d'une notification

Vous devez actualiser la vue dans les déclencheurs après insertion/mise à jour/suppression/truncate pour chaque instruction sur table1 et 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();

De cette façon, votre vue matérialisée est toujours à jour. Cette solution simple peut être difficile à accepter avec des insertions/mises à jour fréquentes et des sélections sporadiques. Dans votre cas (change rarement environ deux fois par jour), elle répond parfaitement à vos besoins.

Pour réaliser une actualisation différée d'une vue matérialisée, vous avez besoin de l'une des fonctionnalités suivantes :

  • déclencheur asynchrone
  • déclencher avant de sélectionner
  • règle sur la sélection avant

Postgres n'en a aucun, il semble donc qu'il n'y ait pas de clair solution postgres.

En tenant compte de cela, je considérerais une fonction wrapper pour les sélections sur mat_view, par exemple

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;

Si c'est acceptable dans la pratique, cela dépend de détails que je ne connais pas.