Bonjour à tous,
Je cherche à optimiser une requête qui est tellement longue que je n'ai jamais les résultats...
Je travaille sur une base de données en local (elle se situe en France, appelons-la BF) comprenant quelques milliers d'enregistrements et une grosse base avec des centaines de milliers d'enregistrements qui se trouve en Suisse (BS).
La base de données suisse contient toutes les données des produits et des composants (un produit est composé de un ou deux composants). Chaque produit est rangé (ou non) dans un casier (qu'on appelle emplacement). On ne peut pas toucher à la structure de BS et étant donné qu'il n'y a aucune notion d'emplacement dans BS, c'est BF qui permet de stocker les emplacements de stockage des produits.
Champs de BS :
Table p: CD_PRODUIT, divers champs sur le produit
Table c: CD_PRODUIT , CD_COMPOSANT, divers champs sur le composant
Table r: CD_COMPOSANT, divers autres renseignements
Voici les champs de BF :
Table e: CD_PRODUIT (ID du produit), CD_COMPOSANT (ID du composant), CD_EMPL (Emplacement de stockage du produit)
Lorsque je cherche à afficher tous les produits (et les lots associés) qui sont dans l'emplacement 'E1' par exemple, c'est assez rapide (Cas 1).
Par contre si je cherche à afficher tous les composants qui possèdent un emplacement, c'est horriblement long (Cas 2).
J'ai essayé plusieurs méthodes mais voici celle qui était la plus rapide lorsqu'il n'y avait pas beaucoup d'emplacements dans la table e de BF :
Je cherche dans la table e de BF tous les produits/composants correspondants à l'emplacement recherché (ou à tous les emplacements) que j'utiliserai ensuite pour aller chercher dans BS les autres informations des produits et composants (noms, détails, etc.) car une jointure entre les deux tables n'est évidemment pas possible !
J'ai créé une fonction (ASP) qui récupère dans un premier temps tous les CD_PRODUIT et CD_COMPOSANT correspondant aux critères de la recherche.
Pour le cas 1 :
SELECT CD_PRODUIT, CD_COMPOSANT FROM e WHERE CD_EMPL = 'E1'
Pour le cas 2 :
SELECT CD_PRODUIT, CD_COMPOSANT FROM e
Cela me permet d'obtenir une condition que j'insère dans la reqête qui attaquera BS. Elle ressemble à :
1 2 3
| AND ((p.CD_PRODUIT = '083950' AND l.CD_COMPOSANT = '074724')
OR (p.CD_PRODUIT = '083961' AND l.CD_COMPOSANT = '074724')
OR (... AND ...) OR (...AND...)...) |
J'ai au final une requête sur BS qui ressemble à ça :
1 2 3 4 5 6
| SELECT p.CD_PRODUIT, p.NOM, l.CD_COMPOSANT, l.NOM,...
FROM p, c, r
WHERE l.CD_PRODUIT = p.CD_PRODUIT AND l.CD_COMPOSANT = r.CD_COMPOSANT
AND ((p.CD_PRODUIT = '083950' AND l.CD_COMPOSANT = '074724')
OR (p.CD_PRODUIT = '083961' AND l.CD_COMPOSANT = '074724')
OR (... AND ...) OR (...AND...)...) |
Lorsque je cherche tous les emplacements, j'ai autant de p.CD_PRODUIT = 'valeur_produit' AND l.CD_COMPOSANT = 'valeur_composant' qu'il y a d'emplacements dans la table e de BF. Avec le nombre d'enregistrements qui s'alourdit, la requête est si longue que je ne vois jamais les résultats...
J'espère que j'ai été assez clair car ce n'est pas forcément évident à expliquer...
Auriez-vous une idée pour rendre plus rapide la requête ?
(J'aurai bien utilisé un IN qui optimise souvent la requête mais là il y a une condition sur le produit et sur le composant...)
Je vous remercie par avance
Partager