sql >> Databáze >  >> RDS >> PostgreSQL

Automaticky aktualizujte materializovaný pohled pomocí pravidla nebo upozornění

Měli byste obnovit zobrazení ve spouštěčích po vložení/aktualizaci/smazání/zkrácení pro každý příkaz v table1 a 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();

Tímto způsobem je váš materializovaný pohled vždy aktuální. Toto jednoduché řešení může být těžké přijmout s častými vkládáními/aktualizacemi a sporadickým výběrem. Ve vašem případě (zřídka se mění dvakrát denně) ideálně vyhovuje vašim potřebám.

Pro realizaci odloženého obnovení materializovaného pohledu potřebujete jednu z následujících funkcí:

  • asynchronní spouštění
  • spustit před výběrem
  • pravidlo pro výběr dříve

Postgres žádné z nich nemá, takže se zdá, že žádné jasné neexistuje postgres řešení.

Když to vezmeme v úvahu, zvážil bych funkci wrapper pro výběry na mat_view, např.

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;

Jestli je to v praxi přijatelné, závisí na podrobnostech, o kterých nevím.



  1. Chyba MySQL:specifikace klíče bez délky klíče

  2. Změna posunu časového pásma na hodnotě datetimeoffset na serveru SQL Server (T-SQL)

  3. Jak najít průměr číselného sloupce v SQL

  4. Jak mohu obnovit plná oprávnění uživatele root MySQL?