Bonsoir a tous,
J'ai un doute sur la maniere d'optimiser une requete utilisant une sous-requete. La table de ma sous-requete sur laquelle je veux faire le lien externe possede un index et lorsque je regarde le plan d'execution, je vois qu'a l'interieur de ma sous-requete, Oracle fait un INDEX FULL SCAN au lieu d'un INDEX RANGE SCAN.
Comment puis-je optimiser ceci ?
Voici un exemple pour reproduire mon cas :
Evidemment je ne peux pas eviter d'avoir ma sous requete, sinon le probleme ne se poserait pas. (bien que dans l'exmple ci dessus il soit facile d'eviter la sous-requete).
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 CREATE TABLE LIEN ( CLE_ORI NUMBER, CLE_DEST NUMBER, CONSTRAINT PK_LIEN_ORI_DEST PRIMARY KEY (CLE_ORI, CLE_DEST) ); CREATE TABLE CAISSE ( CLE NUMBER PRIMARY KEY, TAILLE NUMBER ); SELECT /*+ORDERED INDEX(SUB.LIEN PK_LIEN_ORI_DEST) */ C.CLE FROM CAISSE C, ( SELECT /*+USE_NL(CAISSE LIEN)*/ LIEN.CLE_ORI, CAISSE.TAILLE FROM LIEN, CAISSE WHERE LIEN.CLE_DEST = CAISSE.CLE ) SUB WHERE SUB.CLE_ORI(+) = C.CLE AND C.CLE BETWEEN 123456 AND 456123 AND SUB.TAILLE IS NULL;
Quand je regarde le plan d'execution, j'ai ceci:
Donc j'ai bien un INDEX FULL SCAN sur ma vue au lieu d'un RANGE et ce malgre le "HINT" specifie au debut de la requete.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Operation Object Name Rows Bytes Cost TQ In/Out PStart PStop SELECT STATEMENT 1 109 FILTER NESTED LOOPS OUTER INDEX RANGE SCAN SYS_C0029448 1 39 2 VIEW 1 26 108 NESTED LOOPS 67 3 K 108 INDEX FULL SCAN PK_LIEN_ORI_DEST 82 2 K 26 TABLE ACCESS BY INDEX ROWID CAISSE 1 26 1 INDEX UNIQUE SCAN SYS_C0029448 1
Du coup les performance s'en ressentent bcp et je me demande bien comment indiquer a Oracle d'eviter le FULL SCAN dans ma sous-requete ?
Merci d'avance pour vos reponse. 8)
Partager