-
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
Synthese - Travail sur les performances #560
Comments
Super, et couplé avec l'ajout du plugin Leaflet Cluster, on peut maintenant afficher bien plus de résultats dans la Synthèse : #559 |
Suite de l'amélioration des perfs sur les export de la synthese. La vue Une autre piste évoqué par Gil est de mettre un index sur cette fonction. Voir: https://www.postgresql.org/docs/9.6/indexes-expressional.html et https://www.developpez.net/forums/d1711400/bases-donnees/postgresql/forcer-l-utilisation-d-index/ |
@gildeluermoz a travaillé sur les performances de l'export Synthèse notamment : 6633de4
Sur cette requête on est maintenant sous la seconde pour 42600 données (675ms). En interface, c'est plus long car il faut télécharger le fichier (18 Mo dans cet exemple), et il y a aussi surement des optimisations de la sérialisation Python possibles. Voir #801 Sur les exports Occtax, il a aussi réalisé des optimisations dans ce commit (notamment avec la réduction du
|
Y a un truc zarb dans cette requête (à moins quelle ne soit pas à jour chez moi), c'est cette jointure Aussi est-ce que faire les multiples jointures avec la table C'est des hypothèses, j'ai pas test !.. Mais j'ai du mal à penser que faire appel plusieurs fois à des fonctions qui réalise en arrière plan des SELECT avec jointure et condition soit super optimisée. |
Les dernières versions des requêtes revues par @gildeluermoz sont visibles dans son commit d'hier : 6633de4#diff-b085f02ab00ad5314adf9b708c23b98c |
Ok, ben mon commentaire reste d'actualité ! |
Effectivement, par contre je suis suprise que l'emploi de fonction plutôt que de join augmente les performances. |
Salut,
Si c'est bon en perf, ca pourrait valoir le coup de passer à postgis 3 vu l'utilisation régulière des geojson. |
A t'il déjà été évoqué d'utiliser le système héritage de table de PGSQL pour la nomenclature ? Je n'ai jamais vraiment utilisé ça, mais, en lisant la doc, ca semble coller très bien à nos besoins et voici les avantages dont on pourrait bénéficier :
La seule grosse limite que j'ai identifié, c'est qu'une clé étrangère référençant la table mère n'autorise PAS les valeurs des tables filles (mais le problème sera facilement détectable). Est-ce que quelqu'un à déjà utilisé l'héritage ? Qu'en pensez vous ? |
Sur l'héritage je ne sais pas. |
En partie oui, mais la nomenclature générique reste interrogeable sur la table mère. Les tables filles peuvent ne concerner que les types nomenclatures officiels. La généricité est déjà partiel aujourd'hui, étant donné que les valeurs type_nomenclature sont en dure dans les contraintes des tables qui référence t_nomenclature (gn_synthese entre autres). |
Salut, |
Interessant. |
Intéressant. Dans ce cas là librairie Python me semble une solution plus pérenne. |
Je suis tombé sur Flask-compress aussi, mais voir l'avertissement ici : https://pypi.org/project/Flask-Compress/
Probablement que la compression Python est moins efficace ? |
OK dans ce cas, si c'est plus performant de cette manière, on peut imaginer le faire directement dans la configuration Apache proposée par défaut dans GeoNature. |
J'ai testé l'ajout de la ligne |
La compression des json et geojson a été activée dans la configuration Apache fournie par défaut, depuis la version 2.12 : #2266 La mise en place d'agrégation des géométries dans la Synthèse (#1881) a nécessité de ne plus utiliser le fonctionnement de construction des GeoJSON qui avait été mis en place précédemment. Cette agrégation améliore aussi bien les performances. |
Un travail a été amorcé ces derniers jours sur les performances de la synthèse. Petit retour des enseignements tirés:
Côté front:
pnx-geojson
dans le coeur du front pour afficher des geoson sur nos cartes. C'est très pratique mais peu performant (il multiplie les boucles, et ça à l'air d'être inhérent aux fonction leaflet qu'il utilise -L.GeoJson()
notamment). En construisant les points/lignes/polygones à la "main" (avecL.polyline
,L.circleMarker()
etL.polygon()
) on est plus performant (voir: https://github.com/PnX-SI/GeoNature/blob/perfs/frontend/src/app/syntheseModule/synthese-results/synthese-carte/synthese-carte.component.ts#L133). Le temps de chargement a été réduit à 4 secondes pour 50 000 points. Avec le composant c'est plus autour de 10 sec...Côté back:
select([my_modele])
VSDB.session.query(my_model)
on améliore de 2 à 3 secondes une même requête avec un LIMIT 50000. Il semblerait que la 2ème syntaxe crée des dizaines d'alias sur les tables et colonnes et ralenti le tout. (Voir cette discussion: https://groups.google.com/forum/#!topic/sqlalchemy/IXins449qOo). La 1ère syntaxe, plus rapide, a l'inconvenient de renvoyer destuples
et non des objets du modèle. Mais vu le point suivant, ce n'est pas un problèmeshapely'
qui transforme un WKB en WKT puis en geojson qui fais ramer le tout). Un "st_asgeojson" en base est largement plus efficace. Il faut donc privilégier une vue côté base qui fait un maximum de travail (au niveau géographique en tout cas), plutôt que déporter le travail côté python.En améliorant tout ça on a une synthese qui utilise moins nos outils génériques mais qui est beaucoup plus rapide.
Pour la requete GET qui revoie toutes les obs de la synthèse, on est passé de 8 à 1,5 secondes !
De bout en bout, on passe d'environ 18 secondes à 7-8 secondes pour charger 50 000 obs (depuis l'appel de la requête à son chargement effectif sur la carte en front).
The text was updated successfully, but these errors were encountered: