Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
860 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Optimisation d'une jointure entre 3 tables

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Optimisation d'une jointure entre 3 tables

n°1265231
gavelin
Posté le 13-12-2005 à 10:22:09  profilanswer
 

Bonjour à tous,  
 
J'ai besoin de conseil d'expert concernant une jointure entre 3 tables.  
 
Voici mon probleme: j'ai trois tables A, B et C qui représentent des articles. Elles font partie d'un ERP, je n'ai pas la main dessus  
Dans chacune des table, 2 champs commun: ID et LIBELLE  
 
Une quatrième table, Fiche, comporte une clé externe ID_PRODUIT représentant un identifiant produit pouvant être dans A, B ou C....  
 
Les elements de A B et C sont non disjoints IE je peux avoir comme id dans A: 1, 2  
dans B: 2, 3 et dans C: 3, 4  
 
je cherche a faire une requete la plus optimisée possible -car ces tables sont volumineuses...- permettant de remonter de façon unique tous les produits (id et libelle): D : 1, 2, 3, 4  
 
La façon triviale de faire:  
 
select distinct ID, LIBELLE from  
(  
select ID, LIBELLE from A  
union  
select ID, LIBELLE from B  
union  
select ID, LIBELLE from C  
)  
 
Merci à tous!!!
 
PS: SGBD Oracle 8i

mood
Publicité
Posté le 13-12-2005 à 10:22:09  profilanswer
 

n°1265236
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 10:28:41  profilanswer
 

select distinct ID, LIBELLE from  
(  
select ID, LIBELLE from A  
union  
select ID, LIBELLE from B  
union  
select ID, LIBELLE from C  
)  
 
devient :
 
select ID, LIBELLE from A  
union all
select ID, LIBELLE from B  
union all
select ID, LIBELLE from C  
 
 
Je vois pas ce que tu peux faire de plus :spamafote:


Message édité par Arjuna le 13-12-2005 à 10:29:02
n°1265385
Beegee
Posté le 13-12-2005 à 12:23:21  profilanswer
 

Non, c'est plutôt :
 
select distinct ID, LIBELLE from  
(  
select ID, LIBELLE from A  
union  
select ID, LIBELLE from B  
union  
select ID, LIBELLE from C  
)
 
devient
 
select ID, LIBELLE from A  
union  
select ID, LIBELLE from B  
union  
select ID, LIBELLE from C  
 
car l'opérateur UNION fait déjà le DISTINCT en interne ... :)

n°1265400
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 12:39:29  profilanswer
 

ben non, justement, il faut mettre "all" pour ne pas avoir de distinct, puisque les codes sont exclusives (un même ID ne peut pas être dans deux tables à la fois d'après la question du début).
 
hors, ce qui prends du temps dans un UNION, c'est bien ce distinct... Sans lui, le UNION est infiniment plus rapide.

n°1265402
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 12:40:42  profilanswer
 

euh... j'ai dit une connerie.
 
 
c'est quoi l'erp en question que je ne travaille JAMAIS avec ?
 
ps: du coup c'est beegee qui a raison, et t'as plus qu'à rammer !

n°1265461
gavelin
Posté le 13-12-2005 à 13:48:43  profilanswer
 

loool justement si des meme id peuvent se retrouver dans 2 tables!!!
effectivement c'est l'opération du disctinct qui est lente.
Je me retrouve avec des trucs du genre  
Id 1 lib 1
Id 1 lib 2
Id 2 lib 3
Id 3 lib 4
... etc
 
car pour un même ID je peux avoir des lib différents !!
 
L'ERP en question est BAAN... une horreur au vu du nombre de tables gérées!

n°1265489
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 14:10:47  profilanswer
 

j'en ai bien l'impression !
 
moi je garde GénériX. Le modèle un un peu pourrave, mais il a quand même le 3° niveau de certification MERISE, ce qui implique un truc un minimum pas trop boîteux... là BAAN il semble ne même pas passer le premier niveau ! (c'est gradiose de spliter une table en 3... avec des données redondantes en plus !)

n°1265493
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 14:12:06  profilanswer
 

Sinon, si t'as ça :
 
Id 1 lib 1
Id 1 lib 2
Id 2 lib 3
Id 3 lib 4
 
Est-ce que le "distinct" est réellement utile ? Vérifie que t'as pas systématiquement des valeurs différentes quand elles sont en doublon. Parce que dans ce cas, fout des UNION ALL, ça ira bien plus vite.

n°1265500
gavelin
Posté le 13-12-2005 à 14:15:51  profilanswer
 

c'est ce que j'ai fini par faire.
j'ai mis union all, et je refais un select par dessus afin d'avoir uniquement, de façon arbitraire, le MAX des libelles:
 
select idArt as ARTICLE, MAX(des) as DESIGN_ARTICLE
from  
(
select art.T$ITEM idArt, art.T$DSCA as des from art
union all
select art_test.T$EITM as idArt, art_test.T$DSCA as des from art_test
union all
select projet.T$ITEM as idArt, projet.T$DSCA as des from projet
)
group by idArt
 
Merci a toi en tous cas!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Optimisation d'une jointure entre 3 tables

 

Sujets relatifs
[SGBD/SQL] structure de tables [RESOLU]Jointure conditionnelle
Optimisation mémoire[VBS][SOURCE] Optimisation du Path
drop de toutes les tablesoptimisation : echo ou html
optimisationJointure sur des tables placé sur des SGBD différent, possible?
[SQL] Nombre de champs, optimisation 
Plus de sujets relatifs à : Optimisation d'une jointure entre 3 tables


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR