Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/08/2005, 17h00   #1
Invité de passage
 
Inscription : février 2005
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 14
Points : 2
Points : 2
Par défaut Probleme de jointure externe ...

Bonjour,

Sauriez-vous pourquoi, postgresql se met a me faire un Right Join , alors que je lui ai demander de me faire un Left Join ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
EXPLAIN ANALYSE
SELECT * FROM parametre_general     
	LEFT JOIN (
        SELECT * FROM param_AGENT
        WHERE pspec_ref_id = 94
        ) AS pspec ON pgen_id = pspec_pgen_id
      	WHERE pgen_id = 94
 
QUERY PLAN
"Merge Right Join  (cost=0.00..7.19 rows=2 width=57) (actual time=0.452..0.476 rows=1 loops=1)"
"  Merge Cond: (""outer"".pspec_pgen_id = ""inner"".pgen_id)"
"  ->  Index Scan using index_agent on param_agent  (cost=0.00..3.19 rows=7 width=12) (actual time=0.196..0.229 rows=2 loops=1)"
"        Index Cond: (pspec_ref_id = 94)"
"  ->  Index Scan using pk_parametre_general on parametre_general  (cost=0.00..3.96 rows=2 width=45) (actual time=0.060..0.076 rows=1 loops=1)"
"        Index Cond: (pgen_id = 94)"
"Total runtime: 1.189 ms"
Ce problème est d'autant plus surprenant que pour un id différent,
j'ai le bon comportement ...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
EXPLAIN ANALYSE
        SELECT * FROM parametre_general     
	LEFT OUTER JOIN (
        SELECT * FROM param_AGENT
        WHERE pspec_ref_id = 95
        ) AS pspec ON pspec_pgen_id = pgen_id
      	WHERE pgen_id = 94
 
 
QUERY PLAN
"Merge Left Join  (cost=3.29..7.30 rows=2 width=57) (actual time=0.724..0.761 rows=1 loops=1)"
"  Merge Cond: (""outer"".pgen_id = ""inner"".pspec_pgen_id)"
"  ->  Index Scan using pk_parametre_general on parametre_general  (cost=0.00..3.96 rows=2 width=45) (actual time=0.168..0.184 rows=1 loops=1)"
"        Index Cond: (pgen_id = 94)"
"  ->  Sort  (cost=3.29..3.31 rows=7 width=12) (actual time=0.392..0.405 rows=4 loops=1)"
"        Sort Key: param_agent.pspec_pgen_id"
"        ->  Index Scan using index_agent on param_agent  (cost=0.00..3.19 rows=7 width=12) (actual time=0.088..0.221 rows=7 loops=1)"
"              Index Cond: (pspec_ref_id = 95)"
"Total runtime: 1.487 ms"
J'ai reindexé, fait un vacuum analyse de la table , sans changement ... :/

Help ................
amenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2005, 09h23   #2
Invité de passage
 
Inscription : février 2005
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 14
Points : 2
Points : 2
Bonjour,

Je viens de rentrer de vacances, et j'espère que si personne à répondu a cette question , c'est que vous y êtiez aussi

je tente donc un +1
amenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2005, 11h43   #3
Invité de passage
 
Inscription : février 2005
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 14
Points : 2
Points : 2
Bon on dirait que les 3 semaines de vacances ont été bénéfiques :

J'ai corrigé le problème de cette manière :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
EXPLAIN ANALYSE
SELECT * FROM parametre_general     
   LEFT JOIN (
        SELECT * FROM param_AGENT
        WHERE pspec_ref_id = 94
        AND pspec_pgen_id = 94
        ) AS pspec ON pgen_id = pspec_pgen_id
         WHERE pgen_id = 94
 
QUERY PLAN
"Nested Loop Left Join  (cost=0.00..10.40 rows=2 width=57) (actual time=0.507..0.572 rows=1 loops=1)"
"  ->  Index Scan using pk_parametre_general on parametre_general  (cost=0.00..3.96 rows=2 width=45) (actual time=0.171..0.182 rows=1 loops=1)"
"        Index Cond: (pgen_id = 94)"
"  ->  Index Scan using index_agent on param_agent  (cost=0.00..3.21 rows=1 width=12) (actual time=0.253..0.294 rows=1 loops=1)"
"        Index Cond: (pspec_ref_id = 94)"
"        Filter: (pspec_pgen_id = 94)"
"Total runtime: 1.236 ms"
Je comprends pas pourquoi le fait de doubler la contrainte :
"ON pgen_id = pspec_pgen_id" et "WHERE pgen_id = 94"
et "AND pspec_pgen_id = 94

fait que postgresql ne perd plus les pedales ...
amenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2005, 09h59   #4
Nouveau Membre du Club
 
Avatar de Escandil
 
Inscription : mai 2003
Messages : 63
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France, Côte d'Or (Bourgogne)

Informations forums :
Inscription : mai 2003
Messages : 63
Points : 30
Points : 30
Envoyer un message via MSN à Escandil
Stp
Escandil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h21.


 
 
 
 
Partenaires

Hébergement Web