Bonjour,
j'ai un problème de choix d'index par Oracle.
Version Oracle : 8.1.7
Serveur Unix Aix 5.1
Methode : RULE
Soit 2 tables
CAREC ( 60'000'000 de lignes)
ET GLFAC ( 6'000'000 de lignes)
Sur la table CAREC, on a plusieurs indexs dont 2 en particulierCAREC (
CAREC_NUM NOT NULL NUMBER,
CAREC_ORD NOT NULL NUMBER,
GLFAC_REF NUMBER,
CAINT_NUM NUMBER,
... )
GLFAC
(
GLFAC_REF NOT NULL NUMBER,
GLFAC_DTD NOT NULL DATE,
GLFAC_DTF NOT NULL DATE,
GLFAC_DATECH NOT NULL DATE,
...)
CARECI5 et CAREC_SPI9
La requete SQLCREATE INDEX CARECI5 ON
CAREC(CAINT_NUM, CAREC_STATUT, CAREC_DATREF)
TABLESPACE CA_INDX PCTFREE 20
STORAGE(INITIAL 104857600 NEXT 104857600 PCTINCREASE 0 ) ;
CREATE INDEX ULISM.CAREC_SPI9 ON
CAREC(CAINT_NUM,GLFAC_REF)
TABLESPACE CA_INDX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 200M NEXT 200M PCTINCREASE 0 ) ;
La requête doit normalement utilisé l'index CAREC_SPI9, mais force est de constater qu'en fonction de la date de création, ORACLE prend l'index le plus recent ( CARECI5 quand ce dernier est recréer ).select max(glfac.glfac_datech)
from carec,glfac
where carec.glfac_ref = glfac.glfac_ref
and carec.caint_num = 123323
and glfac.glfac_datech < '01/10/2005'
and glfac.glfac_ref != 1223333
and glfac.glfac_numfac is not null
;
Explain plan quand CARECI5 est l'index créer le plus recemment
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 NESTED LOOPS
3 2 TABLE ACCESS (BY INDEX ROWID) OF 'CAREC'
4 3 INDEX (RANGE SCAN) OF 'CARECI5' (NON-UNIQUE)
5 2 TABLE ACCESS (BY INDEX ROWID) OF 'GLFAC'
6 5 INDEX (UNIQUE SCAN) OF 'GLFACP1' (UNIQUE)
Explain plan quand CAREC_SPI9 est l'index créer le plus recemment
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 NESTED LOOPS
3 2 INDEX (RANGE SCAN) OF 'CAREC_SPI9' (NON-UNIQUE)
4 2 TABLE ACCESS (BY INDEX ROWID) OF 'GLFAC'
5 4 INDEX (UNIQUE SCAN) OF 'GLFACP1' (UNIQUE)
Cette requête est utilisé dans un programme en PRO*C
Lorsqu'elle utilise CAREC_SPI9, temps de traitement 4h
Lorsqu'elle utilise CARECI5, temps de traitement 19h !!!
Pourquoi le fait de re-créer un index modifie la stratégie d'Oracle ?
Merci de votre aide.
Partager