-
Notifications
You must be signed in to change notification settings - Fork 3
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
Recherche de points lente dans certains cas #77
Comments
Option 1 pour résoudre le problème : Pour info, car je n'ai pas oublié ce bug, voici un prototype de requête pour la résolution du problème : Code : Tout sélectionner SELECT pt.nom,polygones.nom_polygone,polygone_type.type_polygone FROM FROM AND modele!=1 LIMIT 2 order by pt.id_point,polygone_type.ordre_taille desc Résultat : Code : Tout sélectionner nom nom_polygone type_polygone Lancée sur la base test, elle prend 100 millisecondes, toutefois :
|
Option 2 vers laquelle je pense finalement me tourner vu que la requête de recherche de point est devenu vraiment trop difficile à maintenir, une nouvelle fonction (méthode ?) pour récupérer les polygones auquel un point appartient... et boucler. |
origine de la décription du bug : https://www.refuges.info/forum/viewtopic.php?f=2&t=5222&p=18833
déplacé du forum vers ici car bien trop technique pour intéresser les autres :
ce qu'on peut voir : si on cherche par exemple "alpette" sans rien changer d'autre au formulaire
C'est plus visible ici http://sly.refuges.info/point_formulaire_recherche.php que là http://www.refuges.info/point_formulaire_recherche.php
La recherche prend environ 3 secondes.
C'est pas dramatique car ça marche plus vite sur www, mais ça cache sans doute un problème latent.
= technique =
J'ai analysé la situation pour retrouver le même type de problème qu'avec l'export des points OSM : les sub-query, c'est à manipuler avec précaution.
Voici la requête en question :
Quand la table des points_gps n'en contient que ~2000 le temps tombe vers 200ms/300ms, mais sur la base test qui en contient bien plus ça passe à 6 secondes.
la base "test" révèle ce problème latent car sa table points_gps contient toujours une grande quantité de points (ceux des polygones étant toujours là) ce qui est d'ailleurs très bien comme ça, ça m'a permis de repéré le problème ;-)
la requête qui consiste à passer d'un mode "ligne à un mode colonne" est une sous requête qui présente un problème de performance, qui est gommé par la petite taille de notre base, mais qui pourrait devenir problématique si on choisi par exemple de mettre les coordonnées des points osm dans points_gps
Ce petit outil en ligne, qui donne une vue un peu plus graphique d'un "explain analyse" sur la requête précédente, donne un peu d'info, grâce à la colonne "rows" par exemple de ce qui se passe :
http://explain.depesz.com/s/ziKn
Mon analyse est que la sous requête
Code : Tout sélectionner
SELECT
pgps.id_point_gps,
STRING_AGG(pg.id_polygone::text,',' ORDER BY pty.ordre_taille DESC) AS liste_polygones
FROM
polygones pg NATURAL JOIN polygone_type pty,
points_gps pgps
WHERE
ST_Within(pgps.geom, pg.geom)
AND
pty.categorie_polygone_type='montagnarde'
GROUP BY pgps.id_point_gps
qui est executée, n'a aucune condition sur quels points on interroge, elle réalise donc une recherche sur tous les points_gps de notre base pour en trouver tous les polygones auxquels ils appartiennent, alors même que la requête complète ne cherche que "alpette"
La solution n'est pour autant pas simple à trouver. Soit on part sur 2 requêtes (je ne suis même pas sûr que ça puisse régler le problème) soit on fait le JOIN de la mort qui tue.
Le bonheur de l'optimisation postgresql
Note: on pourrait considérer ce problème comme de peu d'importance vu que ça marche avec 2000 points (la puissance du serveur compensant la moins bonne requête) seulement cette lenteur pourrait géner 2 possibles évolutions :
The text was updated successfully, but these errors were encountered: