Bonjour à tous,

J'ai un problème d'optimisation de requête . J'ai une requête :

SELECT *
FROM table1
WHERE table1.chps1 IN (SELECT table2.chps1
FROM table2
WHERE table2.chps2 IN (SELECT table3.chps2
FROM table3
WHERE table3.chps2 IN (SELECT table4.chps2
FROM table4)))


Voici le plan d'exécution

Etape Nom de l'étape

9 SELECT STATEMENT
8 NESTED LOOPS
6 NESTED LOOPS
4 NESTED LOOPS
1 table1 TABLE ACCESS [FULL]
3 table2 TABLE ACCESS [BY INDEX ROWID]
2 table2PK INDEX [UNIQUE SCAN]
5 table3PK INDEX [UNIQUE SCAN]
7 table4PK INDEX [UNIQUE SCAN]

Mon problème c est que le full access sur table1 qui fait 1 million d'enregistrements fait que la requête mais plus de 7 minutes pour s'exécuter.
Je voudrais donc savoir si il est possible de modifier la requête pour qu'il n'y ait plus de full access sur ma table1.

PS : j'ai essayé la clause EXISTS à la place du IN mais je dois être mauvais car lorsque je fais la requête :
SELECT chps2 from table3 where exists (SELECT table4.chps2 FROM table4 where table4.chps2=table3.chps2)

je me retrouve avec tous les chps2 de ma table3 alors que je ne devrais avoir que les valeurs de chps2 qui sont également table4.