Bonjour.

Je travaille sur une base 10.2.0.5.0 sur Win2003 SP2.

Voici mon problème :

La requête
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
select * from TABLE3 where CLE2 in ( select CLE2 from TABLE2 where CLE1 = 354063);
ramène 40 lignes en une seconde voir moins.
Si je rajoute la clause ORDER BY j'obtiens un temps de réponse à pleurer !

TABLE2 compte près de 3 millions de lignes (9 champs num(10), 1 champ date)
TABLE3 compte près de 32 million de lignes (4 champs num (10), 1 champ date)

J'ai exécuté un explain plan des 2 requêtes dont voici le résultat.

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
 
SQL> explain plan for select * from TABLE3 where CLE2 in ( select CLE2 from TABLE2 where CLE1 = 354063);
 
Explicité.
 
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3324095648
 
----------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                    |    68 |  2176 |    18   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID  | TABLE3             |    14 |   294 |     3   (0)| 00:00:01 |
|   2 |   NESTED LOOPS                |                    |    68 |  2176 |    18   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| TABLE2             |     5 |    55 |     4   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | IDX_TABLE2_CLE1    |     5 |       |     3   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN           | PK_TABLE3          |    14 |       |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   4 - access("CLE1"=354063)
   5 - access("CLE2"="CLE2")
 
18 ligne(s) sélectionnée(s).
et
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
 
SQL> explain plan for select * from TABLE3 where CLE2 in ( select CLE2 from TABLE2 where CLE1 = 354063) order by CLE_TRI;
 
Explicité.
 
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3634225011
 
-------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                        |    68 |  2176 |    69M  (1)|233:01:59 |
|   1 |  NESTED LOOPS                |                        |    68 |  2176 |    69M  (1)|233:01:59 |
|   2 |   TABLE ACCESS BY INDEX ROWID| TABLE3                 |    31M|   638M|  6161K  (1)| 20:32:24 |
|   3 |    INDEX FULL SCAN           | TABLE4TABLE3           |    31M|       | 64280   (1)| 00:12:52 |
|*  4 |   TABLE ACCESS BY INDEX ROWID| TABLE2                 |     1 |    11 |     2   (0)| 00:00:01 |
|*  5 |    INDEX UNIQUE SCAN         | PK_TABLE2              |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   4 - filter("CLE1"=354063)
   5 - access("CLE2"="CLE2")
 
18 ligne(s) sélectionnée(s).
Quelqu'un pourrait-il m'expliquer pourquoi j'ai une telle variation de temps de réponse?