Selon les documents:
CONCURRENTLY Actualisez la vue matérialisée sans verrouiller les sélections simultanées sur la vue matérialisée. (...)
... AUTRES CONTENUS ...
Même avec cette option, un seul REFRESH à la fois peut s'exécuter sur une seule vue matérialisée .
J'eu une fonction qui a vérifié la dernière fois de rafraîchissement pour une vue et, si MATERIALIZED plus de 60 secondes se sont écoulées, il le rafraîchir.
Cependant, que se passerait-il si j'essayais d'actualiser une vue matérialisée à partir de deux processus distincts en même temps? feraient-ils la queue ou soulèveraient-ils une erreur?
Existe-t-il un moyen de détecter quand une VUE MATÉRIALISÉE est en cours de rafraîchissement et donc d'éviter de la toucher?
Actuellement, j'ai recouru à remplir un enregistrement de table avant d'actualiser (en définissant refreshing
sur true
) puis de le définir à la false
fin du processus.
EXECUTE 'INSERT INTO refresh_status (last_update, refreshing)
VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id;
EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view';
EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id;
Ensuite, chaque fois que j'appelle cette procédure, je vérifie la plus récente last_update
et sa refreshing
valeur. Si refreshing
c'est vrai, n'essayez pas de rafraîchir la vue matérialisée.
EXECUTE 'SELECT
extract(epoch FROM now() - (last_update))::integer,
refreshing
FROM refresh_status
ORDER BY last_update DESC
LIMIT 1' INTO update_seconds_ago, refreshing;
IF(updated_seconds_ago > 60 AND refreshing = FALSE) THEN
-- the refresh block above
END IF;
Cependant, je ne suis pas sûr que l'indicateur d'actualisation soit mis à jour de manière synchrone (je veux dire, il attend vraiment que le rafraîchissement soit réellement terminé)
Cette approche est-elle rationnelle ou manque-t-il quelque chose ici?