Bonjour.
Je travaille sur une base 10.2.0.5.0 sur Win2003 SP2.
Voici mon problème :
La requête
ramène 40 lignes en une seconde voir moins.
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);
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.
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); 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).Quelqu'un pourrait-il m'expliquer pourquoi j'ai une telle variation de temps de réponse?
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).
Partager