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 31/01/2012 12:23:22

Le Martret
Membre

Lenteur d'execution d'une requete avec la version 8.4

Nous avons observé un temps de réponse de 1 à 10 pour une requête simple (select * from data limit 2000000) qui retourne 200000 enregistrements entre  deux versions de postgresql  8.3 et 8.4 avec la même base de données.

1 - ancien serveur
postgresql 8.3  :   Ubuntu 8.04 LTS server, : temps de réponse <2s

2 - nouveau serveur   plus puissant !!!!
postgresql 8.4  :   Ubuntu 10.04 LTS server :  temps de réponse >20s

Idem sur station deux autres stations de travail  avec Ubuntu 10.04 et postgresql 8.4

y-a-t-il une optimisation particulière pour régler ce problème ?
Est-ce un problème d'optimisation ?

Hors ligne

#2 31/01/2012 12:25:06

Marc Cousin
Membre

Re : Lenteur d'execution d'une requete avec la version 8.4

Il faut davantage d'informations pour vous aider:
- La requête
- La définition des tables impliquées (et leur taille)
- Un EXPLAIN ANALYZE de la requête (EXPLAIN ANALYSE ma_requête)


Marc.

Hors ligne

#3 31/01/2012 12:38:23

Le Martret
Membre

Re : Lenteur d'execution d'une requete avec la version 8.4

La table data contient 13 millions d'enregistrements,
11 champs dont 1 champ date et des integer

la requete sur cette table data :
select * from data limit 200000

Le temps est proportionnel aux nombre d'enregistrements retournés et dans un rapport de 1 à 10 toujours
explain analyse select * from data limit 200000 ne me renseigne pas beaucoup !!!
"Limit  (cost=0.00..4270.96 rows=200000 width=49) (actual time=0.022..45.561 rows=200000 loops=1)"
"  ->  Seq Scan on data  (cost=0.00..280496.44 rows=13135044 width=49) (actual time=0.021..23.217 rows=200000 loops=1)"
"Total runtime: 57.002 ms"

Hors ligne

#4 31/01/2012 12:43:46

Marc Cousin
Membre

Re : Lenteur d'execution d'une requete avec la version 8.4

Ok. Donc la différence de temps d'exécution est simplement due au fait qu'à certains moments, les données que vous récupérez sont en cache, et pas à d'autres, je pense.

57ms pour lire 200 000 enregistrements, on est dans le cas où les données sont en cache, probablement.


Marc.

Hors ligne

#5 31/01/2012 17:16:21

Le Martret
Membre

Re : Lenteur d'execution d'une requete avec la version 8.4

Pour affiner les tests, j'ai une fonction PL/PGSQL identique, base identiques sur ces deux versions de postgresql avec très peu
de d'enregistrements en retour (max 112 enregistrements).

La fonction balaie une première table de 600 enregistrements pour extraire toutes les variables associées au point 531 et construit
un tableau pour ces variables trouvées à partir des données de la table data.
ancien serveur :
explain analyse
select * from extrac_intervalleforlocation(531)
"Function Scan on extrac_intervalleforlocation  (cost=0.00..260.00 rows=1000 width=68) (actual time=8357.165..8357.205 rows=112 loops=1)"
"Total runtime: 8357.263 ms"

nouveau serveur
select * from extrac_intervalleforlocation(531)
"Function Scan on extrac_intervalleforlocation  (cost=0.00..260.00 rows=1000 width=68) (actual time=21074.153..21074.156 rows=112 loops=1)"
"Total runtime: 21074.182 ms"

Ici c'est le temps d'execution de la fonction qui est plus du double pour notre nouveau serveur en 8.4 !!!

Dernier test; passage au postgres9.1  sur nouveau serveur et lancement des mêmes tests:
    - temps d'execution < 1 seconde pour le select * from data limit 200000;
    - temps d'execution proche de la seconde pour le select * from extrac_intervalleforlocation(531)

Conclusion : version 8.4 pose réellement un probleme.

Hors ligne

#6 31/01/2012 18:05:14

Marc Cousin
Membre

Re : Lenteur d'execution d'une requete avec la version 8.4

La conclusion me semble un peu trop rapide, vu le peu de diagnostic effectué…

On n'a pas le détail de la fonction, on ne sait pas ce qui prend du temps dedans, bref, on n'a aucune information à part 'ça marche en 8.3, ça marche pas en 8.4, ça marche en 9.1'.

=> On peut avoir le code de la fonction pour commencer ? (le explain ne nous renseigne en rien, quand on a une fonction, puisque c'est une boîte noire).


Marc.

Hors ligne

#7 31/01/2012 18:05:47

gleu
Administrateur

Re : Lenteur d'execution d'une requete avec la version 8.4

Pour exactement la même requête, je n'y crois pas du tout. Il y a forcément quelque chose de différent, au niveau matériel, au niveau système d'exploitation, au niveau configuration de PostgreSQL, ou encore ailleurs.


Guillaume.

Hors ligne

#8 01/02/2012 17:46:46

dverite
Membre

Re : Lenteur d'execution d'une requete avec la version 8.4

Le Martret a écrit :

Nous avons observé un temps de réponse de 1 à 10 pour une requête simple (select * from data limit 2000000) qui retourne 200000 enregistrements entre  deux versions de postgresql  8.3 et 8.4 avec la même base de données.

1 - ancien serveur
postgresql 8.3  :   Ubuntu 8.04 LTS server, : temps de réponse <2s

2 - nouveau serveur   plus puissant !!!!
postgresql 8.4  :   Ubuntu 10.04 LTS server :  temps de réponse >20s

Idem sur station deux autres stations de travail  avec Ubuntu 10.04 et postgresql 8.4

y-a-t-il une optimisation particulière pour régler ce problème ?
Est-ce un problème d'optimisation ?

Une explication possible est que par défaut les packages debian/ubuntu de postgres ont une connexion cryptée avec SSL y compris sur localhost.
Dans le cas d'un gros select * sur un réseau très rapide, a fortiori localhost, ça peut effectivement mettre 10 fois plus de temps en crypté qu'en clair pour transférer tous les résultats.
Et le temps en question ne se voit pas dans l'explain analyze.
En revanche en socket du domaine unix il n'y a jamais de cryptage, c'est précisé dans la doc de libpq.

Hors ligne

Pied de page des forums