Bonjour à tous !
Voilà près de 3 ans que je n’ai rien posté (je sévissais plutôt sur le forum Delphi, hé oui, les questions débiles, c’était moi ! ) mais je n’ai jamais cessé de visiter ce forum et d’apprendre !
Etant complètement newbie en PL/SQL et ayant un besoin urgemment urgent pour le boulot, je me permets de venir chercher vos lumières sur une question d’optimisation de requête SQL :
J’ai défini un curseur comme ceci :
Les paramètres « param1 » et « param2 » sont des variables globales (je sais c’est pas beau !).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CURSOR MonCurseur IS SELECT distinct T1_ch1, T1_ch2, T1_ch3 --- 3 champs de la table T1 FROM T1, T2, T3, T4 --- 4 tables WHERE T2_ch1 like param1 || '_' --- jointures diverses entre les champs des tables and T3_ch1 = param2 and T4_ch2 = T3_ch2 and T1_ch2 = T4_ch2 and T2_ch3 = T1_ch3;
Le champ «T2_ch1» doit prendre la forme suivante : ‘CE01x’ où x peut prendre les valeurs 0, 1, 2 à 9, d’où leoù param1 est un varchar2.
Code : Sélectionner tout - Visualiser dans une fenêtre à part like param1 || _
Mon programme et cette requête marchent très bien, mais le hic c’est que ma requête est super gourmande (temps d’exécution 800ms à 3 secondes) et elle est appelée 18 000 fois (pour chaque couple (param1,param2)) : mon programme tourne du coup pendant plus de 2 heures !
A première vue et après quelques tests, c’est la clause « where/like » qui serait coûteuse.
Qu’en pensez-vous ?
J’ai essayé d’optimiser avec « where/in » pas très concluant :
Existe-t-il un moyen d’optimiser considérablement ma requête ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 WHERE T2_ch1 in (param1|| '0', param1 || '1', param1 || '2', param1 || '3', param1 || '4', param1 || '5', param1 || '6', param1 || '7', param1 || '8', param1 || '9')
Suis-je à côté de la plaque ? (c'est tout à fait possible aussi )
Etant novice sur ce sujet, toute aide serait la bienvenue et je vous en remercie d’avance !
Quelques infos au cas où :
Je travaille sous Toad 7.4, Oracle 9i.
- seul le champ « T3_ch1 » n’est pas indexé
Tailles approximatives des tables :
- T1 : 75 000
- T2 : 15 000
- T3 : 30 000
- T4 : 30 000
Ce qui n'est pas énorme non?
Partager