banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#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: 1146

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: 1146

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: 1146

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: 1146

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

 

Pied de page des forums

Powered by FluxBB