Bonjour,
J'ai une requête qui prend beaucoup de temps à s'exécuter...
J'aimerai qu' un pro du SQL me dise comment optimiser ma requête car je suis persuadé qu'il y a une manière beaucoup plus rapide...
Déja en remplaçcant les decode par des case, ma requête est plus rapide, mais pas tant que ca. Je pense à quelque chose du genre exists à la place du in.
Globalement, cette requête sert à récupérer des plans et formules associées à une entreprise modèle afin de les insérer dans une table (qui sera ensuite utilisée pour associer ces mêmes plans à d'autres entreprises...). L'idée est que certains plans sont contenus dans un même groupe (suivant leur type) et que je ne veux insérer dans la table (qui est en fait une table d'association entre entreprises et plans) uniquement les plans dont un autre plan du meme ensemble n'existe pas déja pour une entreprise.
Ce qui me donne la requête suivante :
Ce qui prend énormément de temps c'est le decode(...) not in decode(...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 INSERT INTO MYTABLE (CODE_ENT, CODE_PLAN, CODE_FORMULE, NB_ABO) ( SELECT E.CODE_ENT, P.CODE_PLAN, FP.CODE_FORMULE,0 FROM ENTREPRISE E JOIN PLAN P ON (P.CODE_ENT = 60) LEFT JOIN FORMULE_PLAN FP ON (FP.CODE_PLAN = P.CODE_PLAN) WHERE (E.CODE_ENT, DECODE(P.TYPE_PLAN,0,'ENSEMBLE1',1,'ENSEMBLE1',2,'ENSEMBLE2',3,'ENSEMBLE2',4,'ENSEMBLE1',5,'ENSEMBLE3',6,'ENSEMBLE2',7,'ENSEMBLE1')) NOT IN ( SELECT CODE_ENT, DECODE(TYPE_PLAN,0,'ENSEMBLE1',1,'ENSEMBLE1',2,'ENSEMBLE2',3,'ENSEMBLE2',4,'ENSEMBLE1',5,'ENSEMBLE3',6,'ENSEMBLE2',7,'ENSEMBLE1') FROM PLAN P1 WHERE P1.CODE_ENT IN (SELECT CODE_ENT FROM ENTREPRISE E WHERE E.CODE_GROUPE = 200 ) ) AND E.CODE_GROUPE = 200 AND E.CODE_ENT != 60 );
Est ce que quelqu'un est capable de me transformer ca en utilisant "exists" ?
Merci d'avance.
Partager