Bonjour a tous!
Je souhaite executer une requête sur notre base Oracle 9i :
Cette requête passe très bien, et très rapidement.select count(r.sigma) from rum_cafe ru, rss r where ru.flag = 'W' and ru.id_rum = r.id_rum
En effet, il y a un index sur ru.flag ainsi que sur les champs id_rum sur les deux tables (primary key)...
Temps d'exécution : 20sec...Résultat 3032 donc on est sur une faible volumétrie.
Seulement, quand je veux ajouter un distinct :
Alors la c'est plus du tout la même chose...select count(distinct(r.sigma)) from rum_cafe ru, rss r where ru.flag = 'W' and ru.id_rum = r.id_rum
Temps d'exécution 20 min ! Résultat 1792...
19 min de plus juste pour faire un distinct sur 3000 lignes, ca fait un peu beaucoup...
J'ai donc sorti les deux plans d'exécution :
Pour la même requête avec le distinct :PLAN_TABLE_OUTPUT
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
-------------------------------------------------------------------------
| 0 | SELECT STATEMEN | | 1 | 20 | 1898 (1)|
| 1 | SORT AGGREGATE | | 1 | 20 | |
| 2 | NESTED LOOPS | | 48438 | 946K| 1898 (1)|
|* 3 | TABLE ACCESS FULL| RUM_CAFE| 48438 | 520K| 1896 (0)|
|* 4 | INDEX UNIQUE SCAN| PK_RSS | 1 | 9 | |
-------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("RU"."FLAG"='W')
4 - access("RU"."ID_RUM"="R"."ID_RUM")
Voila, donc j'ai bien l'impression que mon Oracle se plante dans le plan...PLAN_TABLE_OUTPUT
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost(%CPU)|
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT| | 1 | 26 | | 2682 (0)|
| 1 | SORT GROUP BY | | 1 | 26 | | |
| 2 | MERGE JOIN | | 48438|1229K | | 2682 (0)|
| 3 |TABLE ACCESS BY INDEX ROWID| RSS |2164K| 30M| | 207 (0)|
| 4 | INDEX FULL SCAN | PK_RSS|2164K| | | 26 (0)|
|* 5 | SORT JOIN | | 48438 | 520K| 1922K| 2475 (0)|
|* 6 | TABLE ACCESS FULL| RUM_CAFE | 48438 | 520K| | 1896 (0)|
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - access("RU"."ID_RUM"="R"."ID_RUM")
filter("RU"."ID_RUM"="R"."ID_RUM")
6 - filter("RU"."FLAG"='W')
19 ligne(s) sélectionnée(s).
En effet, au lieu de faire le distinct juste sur les lignes issues de la jointure et des clauses...(ce qui fais qu'il ne fais le distinct que sur 3000 lignes) j'ai l'impression qu'il fais le distinct sur ma table complète (table rum de 2 millions de lignes), qu'ils fais la projection du coté rum_cafe, et qu'il fais un join entre les deux....
Comment faire pour contourner ce problème...
J'ai testé aussi avec d'autres types de requêtes :
sans succès, toujours plus de 20 min...select distinct sigma from rss where id_rum in (select id_rum from rum_cafe where flag='W');
select r.sigma from rum_cafe ru, rss r where ru.flag = 'W' and ru.id_rum = r.id_rum group by sigma
Si quelqu'un a une idée, je suis preneur et je vous remercie tous d'avance.
Partager