[9i] Optimisation requête
Bonjour,
J'ai un problème de perf sur une requête. Les statistiques ont été récoltées
avec dbms_stats sans estimation. En mode choose, la requête dure 10 minutes. En mode /*+ RULE*/, elle dure 18 secondes.
Voici les EXPLAIN PLAN :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=CHOOSE 1 14
FILTER
HASH JOIN OUTER
NESTED LOOPS 1 164 11
NESTED LOOPS 1 144 10
MERGE JOIN CARTESIAN 1 50 3
REMOTE 1 43 2 DBLINK SERIAL
BUFFER SORT 297 2 K 1
INDEX FULL SCAN T1_PK 297 2 K 1
TABLE ACCESS BY INDEX ROWID T2 1 94 8
INDEX RANGE SCAN T2_IDX10 154 K 3
TABLE ACCESS BY INDEX ROWID T3 1 20 2
INDEX UNIQUE SCAN T3_PK 1 1
REMOTE 187 1 K 3 DBLINK SERIAL
Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=HINT: RULE
FILTER
MERGE JOIN OUTER
SORT JOIN
NESTED LOOPS
NESTED LOOPS
NESTED LOOPS
REMOTE DBLINK SERIAL
TABLE ACCESS BY INDEX ROWID T2
INDEX RANGE SCAN T2_IDX10
INDEX UNIQUE SCAN T1_PK
TABLE ACCESS BY INDEX ROWID T3
INDEX UNIQUE SCAN T3_PK
SORT JOIN
REMOTE DBLINK SERIAL |
J'ai l'impression que l'optimiseur sous-estime le nombre de lignes renvoyées par la requête distante. Il estime à 1 ligne alors qu'il y en a 114735. Du coup le MERGE JOIN CARTESIAN avec les 297 lignes de T1 prend trop de temps (34 millions de ligne). Puis ensuite une NL avec 154 000 lignes....
Je precise que l'objet distant est une vue.
Pourquoi l'optimiseur n'estime-t-il pas correctement le coût de la requête distante ? Existe-il un moyen de lui indiquer ?
Merci par avance pour vos réponses,