Requête ralentie par "order by"
Bonjour.
Je travaille sur une base 10.2.0.5.0 sur Win2003 SP2.
Voici mon problème :
La requête
Code:
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 :cry: !
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:
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:
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?