Optimisation d'une jointure entre 3 tables

Optimisation d'une jointure entre 3 tables - SQL/NoSQL - Programmation

Marsh Posté le 13-12-2005 à 10:22:09    

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

Reply

Marsh Posté le 13-12-2005 à 10:22:09   

Reply

Marsh Posté le 13-12-2005 à 10:28:41    

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
Reply

Marsh Posté le 13-12-2005 à 12:23:21    

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 ... :)

Reply

Marsh Posté le 13-12-2005 à 12:39:29    

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.

Reply

Marsh Posté le 13-12-2005 à 12:40:42    

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 !

Reply

Marsh Posté le 13-12-2005 à 13:48:43    

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!

Reply

Marsh Posté le 13-12-2005 à 14:10:47    

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 !)

Reply

Marsh Posté le 13-12-2005 à 14:12:06    

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.

Reply

Marsh Posté le 13-12-2005 à 14:15:51    

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!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed