Plan d'exécution pas logique
Bonjour,
j'ai une sous-requête de la forme suivante :
Code:
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 ... |
La table T1 commporte 16194 lignes et les index suivants (tous valides) pour les colonnes utilisées :
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) :
Code:
1 2 3
| SELECT STATEMENT Optimizer Mode=RULE
TABLE ACCESS BY INDEX ROWID T1
INDEX RANGE SCAN IDX2 |
Plan en 9i (MODE=CHOOSE) : c'est pire au point de vue performances (les stats ont été calculées pour index et tables)
Code:
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 |
Je ne vois pas de justification à ce plan...