Bonjour à tous,
Suite à un certains nombres de tests, je n'arrive pas à optimiser cette requete (très moche) :
Voici son plan :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 select DATASET, START, FINISH from STRUCTURE_DATES s where s.dataset > 0 and exists ( select 1 from task where origin_number=3 and s.structure=onb) or exists (select 1 from network where origin_number= 3 and s.structure=onb);
Cette requête étant générée, je ne peux en aucun cas la modifier (je suis avec l'éditeur en parallèle).
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 ------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ ------------------------ | 0 | SELECT STATEMENT | | 84451 | 2144K| 1382 (2)| 00:00:20 | |* 1 | FILTER | | | | | | | 2 | TABLE ACCESS FULL | STRUCTURE_DATES | 866K| 21M| 1382 (2)| 00:00:20 | |* 3 | TABLE ACCESS BY INDEX ROWID | TASK | 1 | 9 | 2 (0)| 00:00:01 | |* 4 | INDEX RANGE SCAN | I_TASK | 1 | | 1 (0)| 00:00:01 | |* 5 | TABLE ACCESS BY INDEX ROWID| NETWORK | 1 | 10 | 2 (0)| 00:00:01 | |* 6 | INDEX RANGE SCAN | I_NETWORK | 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------
Pour vous donner plus d'éléments, voici un complément :
Si je touche la requete et mets des union, pas de pb de perf : utilisation de 2 merge loop, pour info le cout tombe à 10.
Si j'utilise use_concat, use_nl, leading en hint le plan ne change pas.
Si je split la requete en 2 (en séparant les or mais en laissant le exists), le plan est OK (2 merge loop)
Si je mets un hint rule, j'ai un changement de plan (juste pour dire que les hint sont pris en compte)
(les hints peuvent être une piste)
J ai essayé un index sur s.structure, dataset, pas de changement.
J'ai fait varier les optimizer_index_caching et optimizer_cost_adj à foison, sans aucun changement de plan.
J'ai essayé de grossir les histogrammes des tables des sous jointures, meme résultat.
J'ai également cherché tous azimuts, mais je suis surement passé à coté de qq choses.
Auriez vous d'autres pistes (à part se battre encore plus avec l'éditeur) ?
Version d'oracle : 10.2.0.3
D'avance merci.
Chmanu
Partager