Saltar al contenido

Actualizar una vista materializada automáticamente usando una regla o notificación

Revisamos cada uno de los escritos de nuestro sitio web con la meta de mostrarte siempre información con la mayor veracidad y actual.

Solución:

Debe actualizar la vista en los disparadores después de insertar/actualizar/eliminar/truncar para cada declaración en table1 y 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 esta manera, su vista materializada siempre está actualizada. Esta solución simple puede ser difícil de aceptar con inserciones/actualizaciones frecuentes y selecciones esporádicas. En su caso (rara vez cambia unas dos veces al día) se adapta idealmente a sus necesidades.


Darse cuenta actualización diferida de una vista materializada necesita una de las siguientes características:

  • disparador asíncrono
  • disparar antes de seleccionar
  • regla sobre seleccionar antes

Postgres no tiene ninguno de ellos, por lo que parece que no hay claro solución postgres.

Teniendo esto en cuenta, consideraría una función contenedora para selecciones en mat_view, por ejemplo

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 es aceptable en la práctica depende de detalles que desconozco.

PostgreSQL 9.4 agregado REFRESH CONCURRENTLY a Vistas materializadas.

Esto puede ser lo que está buscando cuando describe intentar configurar una actualización asíncrona de la vista materializada.

Los usuarios que seleccionen desde la vista materializada verán datos incorrectos hasta que finalice la actualización, pero en muchos escenarios que usan una vista materializada, esta es una compensación aceptable.

Utilice un disparador de nivel de declaración que observe las tablas subyacentes en busca de cambios y luego actualice la vista materializada al mismo tiempo.

Recuerda recomendar este ensayo si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *