|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
Bonjour
J'utilise Postgresql depuis peu. J'ai constaté sur ma base récemment installée un problème : l'optimiseur ne sait apparemment pas, quand c'est possible, simplifier une requête et la réécrire avant de l'exécuter. Exemple simple et reproductible : Code :
L'optimiseur sait-il simplifier et réécrire une requête avant de l'exécuter ? Des paramétrages influent-ils au niveau du fichier postgresql.conf ou ailleurs ? Ce problème m'embête grandement car à grande échelle des requêtes générées via BO peuvent contenir plusieurs fois la même condition (where n=1 and n=1 par exemple), et le fait que l'optimiseur sous-estime le nombre de lignes renvoyées me donne de mauvais plans d'exécutions lors de jointures complexes (utilisation de nested loop au lieu de hash join par exemple) Quelqu'un aurait-il des explications sur ce comportement, et éventuellement une solution ? |
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Bonjour,
ce nombre de lignes est effectivement assez sommairement estimé... Maintenant, il n'est pas certain que cela soit à l'origine de tes problèmes de performances. Il y a plusieurs choses à prendre en considération :
__________________
FAQ XML ------------ « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser » Giacomo Leopardi |
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
Merci pour ta réponse
En fait j'ai voulu illustrer l'exmple simplement mais j'ai bel et bien rencontré ce problème dans une requête qui fait une jointure entre une table T1 de 11 millions et une table T2 de 5000 lignes. Quand sur ma table T2 je mets une série de filtres dans la requête, dont certaines conditions sont identiques et répétées (ex : where col1=valeur1 and col2=valeur2 and col2=valeur2), l'optimiseur m'estime à 1 le nb de lignes renvoyées (alors qu'en réalité il y en a 160 et il estime bien à 160 lorsque je ne répète pas 2 fois les mêmes conditions), donc pour le plan d'exécution il fait un nested loop entre T1 (11 millions de lignes) et T2 filtré (forcément il croit récupérer 1 seule ligne au lieu de 160, donc à cause de ça il me parcourt 160 la table T1 ...) alors qu'en réalité si l'optimiseur avait bien estimé à 160 le nb de lignes renvoyées par "T2 filtré", il aurait fait un hash join (c'est ce qu'il fait quand je supprime les conditions répétées dans le filtrage de T2) Apparemment pour choisir "nested loop" au lieu de "hash join", il se baserait sur le nb estimé de lignes renvoyées et non sur le coût, mais je n'en suis pas certain Je m'en vais poster sur le site officiel pour essayer d'avoir des explications à ce comportement lugubre Merci quand-même |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Il semblerait effectivement que dans ce cas le planificateur se base sur des stats erronées pour établir son plan... Tu peux visualiser ces statistiques en consultant la vue pg_stats, et vérifier les postulats sur lesquels le planificateur se base.
Si dans cette vue il apparaît que la liste des valeurs les plus couramment utilisées pour le champ concerné est trop imprécise, tu peux influer sur le nombre d'éléments dans cette liste et dans celle des valeurs "pivots" (valeurs divisant en portions égales les valeurs rencontrées dans la colonne) en modifiant les paramètres most_common_vals et histogram_bounds.
__________________
FAQ XML ------------ « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser » Giacomo Leopardi |
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
Pour la curiosité :
Code :
En fait je viens de migrer depuis Oracle, où là, l'optimiseur le faisait lui, c'est quand-même une mauvaise surprise ... ![]() Pour ma curiosité : la colonne histogram_bounds est vide, sais-tu comment peut-on créer un histogramme sur la colonne ? |
||
|
|
00
|
|
|
#6 | |
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Citation:
Que donnent les stats sur ta table en exploitation ? Sont-ils conformes eux ?
__________________
FAQ XML ------------ « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser » Giacomo Leopardi |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com