Bonjour.

J'ai une base 10g sur une machine en winserver 2003 que je remonte chaque soir dans une base 10g sur une machine en winserver 2000. Je n'ai donc qu'un jour d'écart entre les 2 bases.

J'ai fait un explain plan sur la requête suivante.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
select min(code_t) mini, max(code_t) maxi
from 
(	select code_s
	from t_session 
	where types = 0
	and h_d_o between add_months(trunc(sysdate,'mm'),-1)+19 and  trunc(sysdate,'mm')+18
) s
	inner join m on m.code_s = s.code_s
	inner join a on a.code_m = m.code_m
	inner join t on t.code_a =a.code_a;
avec les tables
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
s (code_s, h_d_o, types)
m (code_m, code_s)
a (code_a, code_m) index I_FK_M0 sur a.code_m
t (code_t, code_a) index I_FK_A sur t.code_a
Ce que je ne comprends pas c'est que je n'obtiens pas les mêmes résultats sur les 2 machines.

machine source
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
 
------------------------------------------------------------------------------------------------
| Id  | Operation              | Name          | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |               |     1 |    56 |       |   736K  (1)| 02:27:13 |
|   1 |  SORT AGGREGATE        |               |     1 |    56 |       |            |          |
|*  2 |   FILTER               |               |       |       |       |            |          |
|*  3 |    HASH JOIN           |               |  1652K|    88M|    12M|   736K  (1)| 02:27:13 |
|*  4 |     HASH JOIN          |               |   235K|  9659K|  1136K| 64115   (2)| 00:12:50 |
|*  5 |      HASH JOIN         |               | 28191 |   798K|       |  7126   (3)| 00:01:26 |
|*  6 |       TABLE ACCESS FULL| S             |  9119 |   151K|       |  2493   (4)| 00:00:30 |
|   7 |       TABLE ACCESS FULL| M             |  3081K|    35M|       |  4614   (1)| 00:00:56 |
|   8 |      TABLE ACCESS FULL | A             |    24M|   307M|       | 27262   (2)| 00:05:28 |
|   9 |     TABLE ACCESS FULL  | T             |   150M|  2004M|       |   484K  (1)| 01:37:00 |
------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - filter(ADD_MONTHS(TRUNC(SYSDATE@!,'fmmm'),-1)+19<=TRUNC(SYSDATE@!,'fmmm')+18)
   3 - access("T"."CODE_A"="A"."CODE_A")
   4 - access("A"."CODE_M"="M"."CODE_M")
   5 - access("M"."CODE_S"="CODE_S")
   6 - filter("TYPES"=0 AND "H_D_O">=ADD_MONTHS(TRUNC(SYSDATE@!,'fmmm'),-
              1)+19 AND "H_D_O"<=TRUNC(SYSDATE@!,'fmmm')+18)
 
26 ligne(s) sélectionnée(s).
machine de copie
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
 
----------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                 |     1 |    56 |  1011K  (1)| 01:24:17 |
|   1 |  SORT AGGREGATE                  |                 |     1 |    56 |            |          |
|*  2 |   FILTER                         |                 |       |       |            |          |
|   3 |    TABLE ACCESS BY INDEX ROWID   | T               |     7 |    98 |     4   (0)| 00:00:01 |
|   4 |     NESTED LOOPS                 |                 |  1652K|    88M|  1011K  (1)| 01:24:17 |
|   5 |      NESTED LOOPS                |                 |   235K|  9659K| 99074   (2)| 00:08:16 |
|*  6 |       HASH JOIN                  |                 | 28191 |   798K| 14536   (7)| 00:01:13 |
|*  7 |        TABLE ACCESS FULL         | S               |  9119 |   151K|  5242  (11)| 00:00:27 |
|   8 |        TABLE ACCESS FULL         | M               |  3081K|    35M|  9170   (4)| 00:00:46 |
|   9 |       TABLE ACCESS BY INDEX ROWID| A               |     8 |   104 |     3   (0)| 00:00:01 |
|* 10 |        INDEX RANGE SCAN          | I_FK_M0         |     9 |       |     2   (0)| 00:00:01 |
|* 11 |      INDEX RANGE SCAN            | I_FK_A          |     7 |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - filter(ADD_MONTHS(TRUNC(SYSDATE@!,'fmmm'),-1)+19<=TRUNC(SYSDATE@!,'fmmm')+18)
   6 - access("M"."CODE_S"="CODE_S")
   7 - filter("TYPES"=0 AND "H_D_O">=ADD_MONTHS(TRUNC(SYSDATE@!,'fmmm'),-1)+1
              9 AND "H_D_O"<=TRUNC(SYSDATE@!,'fmmm')+18)
  10 - access("A"."CODE_M"="M"."CODE_M")
  11 - access("T"."CODE_A"="A"."CODE_A")
 
28 ligne(s) sÚlectionnÚe(s).
La machine source n'utilise pas les indexes.
J'ai comparé les parametres avec l'instruction show parameters, tous les paramètres sont identiques aux chemins près bien sûr.

Quelqu'un pourrait-il m'expliquer pourquoi j'ai cette différence?