Oracle 8.1.7.0.0 sur Sun
Soit la table
et ses indexes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE TABLE "W4"."CASE_VARIABLE" ("TCID" NUMBER(10) NOT NULL, "VARIABLE" VARCHAR2(64) NOT NULL, "TYPE" NUMBER(5) NOT NULL, "RANK" NUMBER(5), "VALUE" VARCHAR2(2000), "DOC_ID" NUMBER(10), "VISIBILITY" NUMBER(5), CONSTRAINT "SYS_C001306" FOREIGN KEY("DOC_ID") REFERENCES "W4"."DOCUMENT"("ID")) TABLESPACE "W4_SCHED" PCTFREE 30 PCTUSED 50 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 1848360K NEXT 102400K MINEXTENTS 1 MAXEXTENTS 249 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1) LOGGING
Soit la requête succinte de repro suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 CREATE INDEX "W4"."INX_CASE_VARIABLE_INDEX" ON "W4"."CASE_VARIABLE" ("TCID") TABLESPACE "W4_INX" PCTFREE 2 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 1058920K NEXT 529544K MINEXTENTS 1 MAXEXTENTS 249 PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1) LOGGING; CREATE INDEX "W4"."INX_VARIABLE_INDEX" ON "W4"."CASE_VARIABLE" ("VARIABLE") TABLESPACE "W4_INX" PCTFREE 2 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 1000000K NEXT 102400K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1) LOGGING;
sachant que
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT * FROM CASE_VARIABLE WHERE VARIABLE='dossierCanton'
1) les statistiques sont à jour
2) la sélectivité de l'index est bonne (450 valeurs distinctes sur 15 millions de tuples)
3) la stratégie de l'optimiseur au niveau instance est "CHOOSE"
Comment expliquer que l'optimiseur choisisse un FULL SCAN sur cette table ? Si on force l'optimiseur en mode RULE, l'index est correctement choisi.
A relever que si l'on choisit un SELECT VARIABLE plutôt qu'un SELECT *, l'index est correctement choisi (encore heureux avec une couverture par index ).
Partager