PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 24/05/2021 12:22:16

jolafrite
Membre

Problème classique de mauvais plan mais aucune solution

Bonjour les amis. Je fais face à un problème très connu sur le net visiblement.

Postgre construit un mauvais plan qui résulte en un nested loop et un index scan exécutés 3000x. Le plan croit qu'il y aura 1 row mais il y en a 3000. Malgré le fait que j'exécute le sql des dizaines de fois postgre continue à produire le même mauvais plan complètement déconnecté de la réalité. C'est vraiment étonnant que postgre dispose de l'info que le plan est mauvais mais continue à reproduire le même problème indéfiniment.

Bref j'ai appliqué de nombreuses solutions trouvées sur le net mais sans succès (le vacuum est ok, les stats contiennent le bon nombre de rows, et tout un tas d'autres checks usuels sont ok).

Au final le plus simple c'est de faire un "SET enable_nestloop = off;" avant d'exécuter mon sql. Je peux vivre avec ça mais je voudrais être sur que ce "SET enable_nestloop = off;" ne soit effectif que sur mon sql lent et pas sur les éventuels autres qui seraient en cours d'exécution en même temps.

Comment puis-je dire à postgre de n'appliquer "SET enable_nestloop = off;" que sur 1 seul sql ?

Autre chose: est-ce qu'il est prévu dans la roadmap que postgre utilise son "explain analyze" pour s'améliorer plutôt que de répéter systématiquement la même erreur sans aucun mécanisme interne pour corriger un tel disfonctionnement ?

Merci !

Hors ligne

#2 24/05/2021 13:20:23

rjuju
Administrateur

Re : Problème classique de mauvais plan mais aucune solution

Bonjour,


Impossible de donner un avis avec aussi peu d'information.  Vous pouvez regarder du côté de https://wiki.postgresql.org/wiki/Slow_Query_Questions pour les détails à fournir.


Il y a différents projets qui tentent de résoudre le problème avec du machine learning, par exemple https://github.com/yamatattsu/pg_plan_advsr (extension) ou https://github.com/postgrespro/aqo (extension mais qui nécessite une version patchée de postgres).


Mais idéalement il faudrait regarder du côté de https://commitfest.postgresql.org/33/2959/ et tester le patch voir s'il résoud votre problème.  Que cela soit le cas ou non n'hésitez pas à donner un retour.le cas ou non.

Hors ligne

Pied de page des forums