PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Odśwież widok zmaterializowany automatycznie za pomocą reguły lub powiadom

Powinieneś odświeżyć widok w wyzwalaczach po wstawieniu/aktualizacji/usunięciu/obcięcie dla każdej instrukcji w table1 i 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();

W ten sposób Twój zmaterializowany widok jest zawsze aktualny. To proste rozwiązanie może być trudne do zaakceptowania przy częstych wstawkach/aktualizacjach i sporadycznych wyborach. W Twoim przypadku (rzadko zmiany około dwa razy dziennie) idealnie pasuje do Twoich potrzeb.

Aby zrealizować odroczone odświeżanie zmaterializowanego widoku potrzebujesz jednej z następujących funkcji:

  • asynchroniczny wyzwalacz
  • uruchom przed wybraniem
  • zasada wyboru przed

Postgres ich nie ma, więc wydaje się, że nie ma jasnych rozwiązanie postgres.

Biorąc to pod uwagę, rozważyłbym funkcję opakowującą dla zaznaczeń na mat_view, np.

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;

To, czy jest to akceptowalne w praktyce, zależy od szczegółów, o których nie wiem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak dodać kolumnę, jeśli nie istnieje w PostgreSQL?

  2. Utwórz kopię zapasową/przywróć zadokowaną bazę danych PostgreSQL

  3. Funkcja Escape dla wyrażeń regularnych lub wzorców LIKE

  4. Date_trunc w PostgreSQL w mySQL

  5. Jaka jest różnica między pg_table_size, pg_relation_size i pg_total_relation_size? (PostgreSQL)