-
Notifications
You must be signed in to change notification settings - Fork 102
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cor_area_taxon et performances #997
Comments
En lien avec #617 |
Oui c'est peut-être améliorable et on se pose toujours la question d'alternative aux triggers mais pas encore trouvé car on travaille parfois directement dans la BDD. Cette table est utile pour Occtax-mobile en effet et important à son fonctionnement. En effet quand on localise dans l'application, cela indique pour chaque taxon si ils n'ont jamais été vu dans la zone. Et si ils ont déjà vu, alors combien de fois et depuis quand. |
Oui, il faut se poser la question de l'importance de instantanéité de l'info dans ce cas. Est-ce qu'une VM raffrachit à un certain pas de temps serait plus performante ? |
Qu'en est il aussi de la possibilité d'utiliser des triggers Pour importer plusieurs millions de données, je suis aussi obligé de désactiver ce trigger car il s'applique aussi aux ajouts. J’insère les données puis je le rejoue globalement. Or, le rejouer globalement le rend bien plus rapide. Si en passant ce trigger en |
Oui si une fonction permet de les jouer en une fois à la fin et non pas ligne par ligne, ça nous aiderait fortement ! En attendant, il faut voir comment combiner des triggers ligne par ligne et des actions globales, sans dupliquer du code et garder une maintenance viable des actions et de la BDD. |
Pour les triggers et le fait de faciliter leur désactivation et d'exécuter leur équivalent globalement, l'idéal serait de les baser au maximum sur des fonctions SQL, pour faciliter la maintenance de leur action et éviter de les dupliquer. Mais je ne sais pas dans quelle mesure cela est possible car le trigger travaille ligne par ligne ? Et pour certains cas où on n'a pas besoin d'instantanéité, on peut imaginer en pas utiliser de trigger mais exécuter une action en cron à intervalle régulier. |
Une alternative entre le trigger et le cron : un cron au niveau de la BDD ? |
Une autre piste à envisager serait de modifier les triggers pour qu'ils agissent non plus ligne par ligne mais pour l'ensemble des lignes modifiées lors d'une transaction. Pour cela les triggers doivent être créés avec Depuis Postgresql v10, il est possible d'utiliser des tables de transition avec un trigger agissant au niveau STATEMENT. Ressource : https://stackoverflow.com/questions/24193567/for-each-statement-trigger-example |
J'ai passé le nouveau trigger de sensibilité et le trigger de calcul des aires en "on each statement". -- sans trigger -- Avec trigger sensi on each statement -- trigger area_synthese on each row initial (st_touches sur toutes les geom) --trigger area_synthese on each statement (st_touches sur toutes les geom) -- triger area on each statement optimisé (st_touches seulement sur les geom non ponctuelles) -- tout trigger activé sauf cor_area_taxon -- tout trigger activé Le "on each statement" ne semble pas faire gagner énormément de performances (ce qui est étrange). Mais c'est clairement le trigger de calcul de cor_area_taxon qui pose problème. Une solution serait de remplacer ce trigger par une vue materialisée (ce qui aurait aussi pour conséquence de pouvoir diminuer la taille de la synchronisation mobile en ne prenant que les aires et les taxons (?) utilisés) |
Merci @TheoLechemia d'avoir pris le temps de faire ces tests! très inscructif. En effet, personnellement, je pencherai plutôt pour une vue matérialisée. |
Oui pour |
Et avec l'extension pg_cron, apparement native sur Buster (postgresql-11-cron) : Cela éviterait un niveau supplémentaire d'administration (cron système). |
Éventuellement mais il faut voir les conséquences en terme de dépendances et de maintenance. On prévoit aussi d'imposer une version 10 minimum de PG à partir de la prochaine release pour supporter les triggers FOR EACH STATEMENT mais là ça imposerait la version 11 si je comprends bien. A creuser pour un peu plus tard je pense. |
Après avoir fait des tests, @amandine-sahl propose même de n'en fait qu'une vue, OK en performances à ses premiers tests. Vue de test : CREATE OR REPLACE VIEW gn_synthese.cor_area_taxon
AS SELECT s.cd_nom,
cas.id_area,
count(DISTINCT s.id_synthese) AS nb_obs,
max(s.date_min) AS last_date
FROM gn_synthese.synthese s
JOIN gn_synthese.cor_area_synthese cas ON cas.id_synthese = s.id_synthese
JOIN ref_geo.li_grids lg ON lg.id_area = cas.id_area AND lg.zc = true
GROUP BY s.cd_nom, cas.id_area;
|
Les triggers ON EACH STATEMENT ne sont pas disponibles dans PostgreSQL 9. Or c'est la version 9 qui est fournie avec Debian 9. Depuis la version 2.5 de GeoNature, on ne supporte plus Debian 9 officiellement, mais on avait fourni une méthode pour continuer à utiliser Debia 9 (en forçant l'installation d'une version plus récente de Python). Avec GeoNature 2.6.0 à venir on a besoin de PostgreSQL 10 minimum pour les triggers ON EACH STATEMENT. J'ai tenté une mise à jour automatique de PostgreSQL en version 11 sur le serveur de DEMO qui est en Debian 9, ça passe bien, mais pour PostGIS c'est plus compliqué. A priori la mise à niveau automatique ne se fait pas toute seule. Il faut dumper les BDD spatiales et les restaurer dans la version mise à jour de PostgreSQL. Pour la mise à jour de PostgreSQL 9 à 11 sur Debian 9, j'ai suivi https://praderas.org/en/upgrading-postgresql-11-debian-stretch, mais en utilisant aussi https://computingforgeeks.com/how-to-install-postgresql-11-on-debian-9-debian-8/ pour ajouter les sources lists avant de lancer l'installation de PostgreSQL 11. Du fait qu'on utilise PostGIS, c'est plus complexe qu'une migration de version de PostgreSQL. De mon côté je n'ai pas réussi, donc je ne suis pas sur qu'on puisse indiquer une méthode assez simple et fiable. |
Oui c'est dans la logique des choses. Plutôt que de forcer des versions non officiellement supportées par la distrib, on impose le passage à Debian 10. |
OK la 2.5.0 préparait déjà le terrain dans ce sens. 😀 |
Remplacement par une vue initié dans #1201. À terme la vue gn_synthese.v_color_taxon_area est amené à disparaître, le calcul de la couleur relevant du front. Ainsi, il ne m’a pas semblé très utile d’essayer d’éviter d’avoir une vue sur une vue. |
J’ai rajouté le filtrage pour un type de maille donnée avec le paramètre Note : il n’y a pas de route permettant d’accéder à la vue |
La table et son trigger ont été remplacés par une vue dans la table. Si vous utilisez Occtax-mobile, à remplir avec le code de type de zonage que vous souhaitez utiliser pour les unités géographiques. |
Les triggers qui peuplent cor_area_taxon sont extrèmement lourds sur de gros jeux de données et plombent littéralement les performances.
A titre d'exemple, j'ai été contraint d'interrompre une requête de suppression 2000 données dans ma synthèse (19 millions de lignes pour plus de 4000 taxons) après plus de 8h. Une fois les triggers supprimés, suppression effective en moins d'une minute.
Il en est de même sur les update, il y a quelques temps, je ne parvenais pas à peupler ma table cor_area_synthese (requête qui a tourné plus d'une semaine...). Supprimer les triggers " upsert" pour cor_area_taxon a réduit ce travail à quelques heures.
Une recherche sur les dépots montre que cor_area_taxon n'est utilisée que pour la vue d'API
/color_taxon
(tablecor_area_taxon
> vuev_color_area_taxon
> modelVColorAreaTaxon
> route/color_taxon
). Pour quel usage? l'appli mobile mais apparement plus utilisée dans la nouvelle appli occtax (utilisé dans l'ancienne appli mobile)?D'où ma question "qui tue", Est-il pertinent de conserver cette table, en tout cas dans leur fonctionnement actuel avec triggers très lourds pour les performances ?
The text was updated successfully, but these errors were encountered: