[PL/SQL] Optimisation d'une requête (like?)
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 ! :oops:) mais je n’ai jamais cessé de visiter ce forum et d’apprendre ! :king:
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 :
Code:
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; |
Les paramètres « param1 » et « param2 » sont des variables globales (je sais c’est pas beau !).
Le champ «T2_ch1» doit prendre la forme suivante : ‘CE01x’ où x peut prendre les valeurs 0, 1, 2 à 9, d’où le où param1 est un varchar2.
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 :
Code:
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') |
Existe-t-il un moyen d’optimiser considérablement ma requête ?
Suis-je à côté de la plaque ? (c'est tout à fait possible aussi :aie: )
Etant novice sur ce sujet, toute aide serait la bienvenue et je vous en remercie d’avance ! :lol:
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? :|