PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggiorna automaticamente una vista materializzata utilizzando una regola o notifica

Dovresti aggiornare la vista nei trigger dopo l'inserimento/aggiornamento/eliminazione/troncamento per ogni istruzione su table1 e 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();

In questo modo la tua visione materializzata è sempre aggiornata. Questa semplice soluzione potrebbe essere difficile da accettare con frequenti inserimenti/aggiornamenti e selezioni sporadiche. Nel tuo caso (cambia raramente circa due volte al giorno) si adatta perfettamente alle tue esigenze.

Per realizzare un aggiornamento differito di una vista materializzata è necessaria una delle seguenti funzionalità:

  • attivatore asincrono
  • attiva prima di selezionare
  • regola sulla selezione prima

Postgres non ne ha nessuno, quindi sembra che non ci sia clear soluzione postgres.

Tenendo conto di ciò, prenderei in considerazione una funzione wrapper per select su mat_view, ad esempio

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;

Se è accettabile in pratica dipende da particolari che non conosco.