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 :
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....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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,
Partager