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 : 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
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,