Bonjour,

j'ai une sous-requête de la forme suivante :
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 ...
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 : 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
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
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...