Annonce
Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !
10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …
Retrouver nos membres bienfaiteurs
#1 Tue 16 July 2024 09:32
- Marc.Candeil
- Juste Inscrit !
- Date d'inscription: 15 Jul 2024
- Messages: 3
POSTGRES : Rafraichir plusieurs vues materialisees
Bonjour,
J'ai créé une vue (v_meteo_data) pour récupérer des données pluvio d'un serveur différent (DBLINK).
Pour plus de rapidité pour l'affichage des résultats, j'ai créé plusieurs vues matérialisées pour récupérer qu'une partie des données (pluvio sur les 30 derniers jours, pluvio sur les 12 derniers mois).
Afin de rafraichir les vues matérialisées (v_meteo_data_30j et v_meteo_data_12m), j'ai créé un déclencheur sur ma vue:
Code:
CREATE TRIGGER maj_vm_meteo_data INSTEAD OF INSERT OR UPDATE ON eau.v_meteo_data FOR EACH ROW EXECUTE PROCEDURE eau.mv_meteo_data_refresh();
Qui déclenche la fonction suivante :
Code:
CREATE OR REPLACE FUNCTION eau.mv_meteo_data_refresh() RETURNS trigger LANGUAGE 'plpgsql' COST 100 VOLATILE NOT LEAKPROOF AS $BODY$ BEGIN REFRESH MATERIALIZED VIEW eau.v_meteo_data_30j; REFRESH MATERIALIZED VIEW eau.v_meteo_data_12m; RETURN NULL; END; $BODY$; ALTER FUNCTION eau.mv_meteo_data_refresh() OWNER TO bdd_eau;
Problème : Dés que ma vue v_meteo_data se met à jour, le réactualisation des vues matérialisées se s'exécute pas. Je n'ai pourtant pas eu d'erreur à la création de cette procédure.
Je ne vois pas où se situe le problème ... Est-ce que quelqu'un aurait une idée ?
Merci de vos retours
Hors ligne
#2 Tue 16 July 2024 10:05
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: POSTGRES : Rafraichir plusieurs vues materialisees
Bonjour,
si je comprends bien, v_meteo_data est une vue. Quand vous dites que la vue se met à jour, vous voulez dire que les données exploitées par la vue ont changées ou que vous avez explicitement une commande du type insert into eau.v_meteo_data ?
Si il n'y a pas d'appel explicite, votre trigger ne se déclenchera pas puisque la commande se déroule sur votre autre serveur. La difficulté réside dans le fait que vous avez deux serveurs séparés. Pour résoudre votre problème, j'utiliserais au choix :
* l'extension pg_cron qui permet d'executer des manière répetitives dans votre serveur postgresql
* la programmation d'une tâche répetitive au niveau du système d'exploitation (cron sous linux, task scheduler sous windows)
* la programmation un trigger sur les données résidant dans votre serveur distant pour qu'il démarre le rafraichissement des vues sur votre serveur de vues.
Hors ligne
#3 Tue 16 July 2024 10:18
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: POSTGRES : Rafraichir plusieurs vues materialisees
Si vous optez pour le trigger vous devriez également utiliser la clause FOR EACH STATEMENT plutôt que FOR EACH ROW : si vous inserez 10 000 lignes d'un coup dans votre source de données, vous ne voudrez sans dout pas rafraichir 10 000 fois votre vue, mais une seule fois a la fin de l'execution de votre commande.
Dernière modification par tumasgiu (Tue 16 July 2024 10:58)
Hors ligne
#4 Tue 16 July 2024 16:24
- Marc.Candeil
- Juste Inscrit !
- Date d'inscription: 15 Jul 2024
- Messages: 3
Re: POSTGRES : Rafraichir plusieurs vues materialisees
Pour préciser,
ma vue v_meteo_data (DBLINK) fonctionne très bien. Les données sont bien actualisées.
Le trigger maj_vm_meteo_data associé à cette vue devrait rafraichir les deux vues matérialisées v_meteo_data_30j et v_meteo_data_12m.
Est ce que l'exécution d'un trigger est différent sur une table que sur une vue pour rafraichir une vue matérialisée?
Merci de votre retour
Hors ligne
#5 Wed 17 July 2024 08:36
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: POSTGRES : Rafraichir plusieurs vues materialisees
Est ce que l'exécution d'un trigger est différent sur une table que sur une vue pour rafraichir une vue matérialisée?
Les triggers se déclenchent lors qu'une commande sql est exécutée sur un objet. Donc votre trigger ne se déclenchera que si quelqui'un ou un programme lance une commande comme
Code:
INSERT INTO v_meteo_data(x,y) VALUES (1,2);
Ce que vous avez dit a postgresql de faire, c'est d'executer la procédure eau.mv_meteo_data_refresh à la place de la commande INSERT.
Les triggers attachées aux vues sont en général utilisés pour créér ce qu'on appelle des vues editables. Cela permet de mettre à jour les données des tables utilisées par la définition d'une vue directement depuis la vue plutôt que depuis les tables.
Votre trigger ne se déclenchera donc pas à moins que vous executiez des commandes INSERT ou UPDATE sur celle-ci. Votre vue v_meteo_data ne s'actualise pas vraiment, mais ré-execute la requête select que vous avez utilisez comme définition à chaque fois que celle-ci est consultée.
Pour que votre idée fonctionne, votre trigger doit être défini sur les tables utilisée par votre vue, là ou les commandes INSERT et UPDATE s'éxecutent.
Comme votre idée est d'avoir des vues à J-12 et J-30, je pense qu'un rafraichissement journalier des vues via une tâche pg_cron devrait être satisfaisant.
Dernière modification par tumasgiu (Wed 17 July 2024 08:37)
Hors ligne
#6 Wed 17 July 2024 13:42
- Marc.Candeil
- Juste Inscrit !
- Date d'inscription: 15 Jul 2024
- Messages: 3
Re: POSTGRES : Rafraichir plusieurs vues materialisees
Merci pour ce retour.
Effectivement, un rafraichissement journalier suffit pour le fonctionnement de mon application.
Cependant, je ne connais absolument pas la tâche pg_cron. Où la trouve t'on ? Le paramétrage se fait il à partir de PgAmin ?
Avez vous de la documentation sur cette procédure ?
Merci de votre retour
Hors ligne
#7 Wed 17 July 2024 14:47
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: POSTGRES : Rafraichir plusieurs vues materialisees
pg_cron est une extension postgresql mais qui n'est pas disponible sur windows.
Il y a à ma connaissance deux alternatives si votre serveur s'execute sous windows : pg_timetable et pgagent.
L'avantage de pgAgent est que l'on peut l'administrer depuis pgAdmin, peut être que c'est la solution qui sera la plus adaptée :
https://www.pgadmin.org/download/
https://www.pgadmin.org/docs/pgadmin4/l … agent.html
Hors ligne