Bonjour,
j'ai une sous-requête de la forme suivante :
La table T1 commporte 16194 lignes et les index suivants (tous valides) pour les colonnes utilisées :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 select ... from T1 where T1.C1 = constante and T1.C2 = constante and T1.C3 = constante and T1.C4 = constante and T1.C5 = constante and ...
IDX2 (non unique) sur T1(C1,C2) - 48 clés distinctes
IDX4 (non unique) sur T1(C1,C2,C3,C4,C5,...) - 16194 clés distinctes
IDX6 (non unique) sur T1(C3) - 2084 clés distinctes
IDX7 (non unique) sur T1(C4) - 107 clés distinctes
Logiquement, et c'est limpide, l'optimiseur devrait utiliser lindex IDX4, et bien non ...
Plan en 8i (MODE=RULE) :
Plan en 9i (MODE=CHOOSE) : c'est pire au point de vue performances (les stats ont été calculées pour index et tables)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT STATEMENT Optimizer Mode=RULE TABLE ACCESS BY INDEX ROWID T1 INDEX RANGE SCAN IDX2
Je ne vois pas de justification à ce plan...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Operation Object Name Rows Bytes Cost SELECT STATEMENT Optimizer Mode=CHOOSE 1 3 TABLE ACCESS BY INDEX ROWID T1 1 292 3 BITMAP CONVERSION TO ROWIDS BITMAP AND BITMAP CONVERSION FROM ROWIDS INDEX RANGE SCAN IDX6 1 BITMAP CONVERSION FROM ROWIDS INDEX RANGE SCAN IDX7 1
Partager