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 Re : Optimisation » temps d'execution contradictoires » 14/10/2009 12:42:06

Bob

Merci Marc pour cette réponse qui m'a permis de vérifier un certain nombre de choses.

Les tests que j'ai présentés étaient réalisés sur un pc sous windows xp en local avec la v8.4 de postgresql.

Je viens de refaire ces tests sur un serveur linux fedora core 5 mais avec la v8.3 de postgresql. Et là les résultats ne sont pas contradictoires même si on a toujours la pénalité, effectivement assez forte, du explain analyse.

Je ne me souviens pas avoir constaté des résultats contradictoires entre postgresql v8.3/windows et postgresql v8.3 sous linux mais je ne suis pas sûr de ça. Il faudrait que je réinstalle pour faire les tests...

Je pense néanmoins que Windows y est pour beaucoup...

Je ne ferai donc plus de test de performance sous ce systeme.

#2 Optimisation » temps d'execution contradictoires » 14/10/2009 11:07:21

Bob
Réponses : 4

Bonjour,

Je cherche à évaluer la performance de 2 requêtes répondant à la même question.

PgAdmin affiche le temps d'exécution d'une requête en ms (sans faire d'EXPLAIN ANALYZE), en bas à droite de la fenêtre.
Et EXPLAIN ANALYSE permet d'obtenir le Total rutime en ms.

Or ces 2 mesures conduisent à des résultats diamétralement opposés, le temps d'exécution donné par PgAdmin semblant plus proche du temps d'exécution réel :
Selon le temps PgAdmin, c'est la requête 2 qui est meilleure.
Selon le total Runtime de EXPLAIN ANALYZE, la requête 1 est la meilleure (avec un écart énorme)

Comment expliquer ces résultats, sachant que la doc postgresql dit :
"Le Total runtime (temps total d'exécution) affiché par EXPLAIN ANALYZE inclut les temps de lancement et d'arrêt de l'exécuteur ainsi que le temps passé lors du traitement des lignes de résultat. Il n'inclut pas le temps passé pour l'analyse, la réécriture ou la planification."

Voici les 2 requêtes et les temps :

Requête 1 :

select productid from product p
where not exists (select * from salesorderdetail s where p.productid=s.productid);

Durée d'exécution donné par pgAdmin : 140 ms
total runtime (donné par explain analyze) : 616 ms

"Hash Anti Join  (cost=4581.85..5109.91 rows=736 width=4) (actual time=570.071..614.628 rows=733 loops=1)"
"  Hash Cond: (p.productid = s.productid)"
"  ->  Seq Scan on product p  (cost=0.00..27.99 rows=999 width=4) (actual time=0.011..2.404 rows=999 loops=1)"
"  ->  Hash  (cost=2589.71..2589.71 rows=121371 width=4) (actual time=569.436..569.436 rows=121371 loops=1)"
"        ->  Seq Scan on salesorderdetail s  (cost=0.00..2589.71 rows=121371 width=4) (actual time=0.005..290.420 rows=121371 loops=1)"
"Total runtime: 616.222 ms"


Requête 2 :

select productid from product
except
select productid from salesorderdetail;

Durée d'exécution donné par pgAdmin : 110 ms
total runtime (donné par explain analyze) : 1525 ms

"HashSetOp Except  (cost=0.00..4147.32 rows=999 width=4) (actual time=1522.398..1523.986 rows=733 loops=1)"
"  ->  Append  (cost=0.00..3841.40 rows=122370 width=4) (actual time=0.024..1251.816 rows=122370 loops=1)"
"        ->  Subquery Scan "*SELECT* 1"  (cost=0.00..37.98 rows=999 width=4) (actual time=0.018..6.281 rows=999 loops=1)"
"              ->  Seq Scan on product  (cost=0.00..27.99 rows=999 width=4) (actual time=0.010..2.359 rows=999 loops=1)"
"        ->  Subquery Scan "*SELECT* 2"  (cost=0.00..3803.42 rows=121371 width=4) (actual time=0.010..773.063 rows=121371 loops=1)"
"              ->  Seq Scan on salesorderdetail  (cost=0.00..2589.71 rows=121371 width=4) (actual time=0.004..285.410 rows=121371 loops=1)"
"Total runtime: 1525.589 ms"

Pied de page des forums

Propulsé par FluxBB