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 :
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;
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’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 : 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')
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 )

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?