Salut !
J'utilise une clause WITH pour définir une sélection que je réutilise ensuite plusieurs fois dans la requête, notament pour joindre à de grosses tables.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 WITH t as ( SELECT ... FROM GRILLE, DETAIL_GRILLE, ... ...) SELECT * FROM t WHERE ... UNION ALL SELECT * FROM t LEFT OUTER JOIN GRILLE_ORDRE ON... LEFT OUTER JOIN ORDRE ON ... WHERE...
Bien, CBO reconnait que ma requête est très sélective, et me la matérialise : que du bonheur.
(Rows = 23)
Ensuite, lorsqu'avec cette toute petite matérialisation je devrais taper une centaine de fois au total sur des indexes uniques, il veut plus !
HASH JOIN + FTS au lieu de NL JOIN + INDEX UNIQUE SCAN.
Le plan ci-dessous montre que INSERT STATEMENT (matérialisation) => rows = 23
Table access full SYS_TEMP_0FD9D6670_245B0AE9 => 60K rows.
Est-ce que je n'ai rien compris à la signification d'un explain plan, où c'est CBO qui n'est pas consistant sur ces estimations ??
Je suis sous Oracle 9.2.0.8
Merci d'avance
PS : quand je force le plan à coup de hints, le tout s'exécute 15 fois plus vite. Je voudrais surtout qu'on m'éclaire un peu (le summum serait qu'on me dise qu'il y a un patch, ou une option cachée de warior, ...)
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
30
31
32
33
34
35
36
37 ----------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost | ------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 254K| 15M| | 29790 | | 2 | TEMP TABLE TRANSFORMATION | | | | | | | 1 | RECURSIVE EXECUTION | SYS_LE_2_0 | | | | | | 0 | INSERT STATEMENT | | 23 | 2139 | | 34 | | 1 | LOAD AS SELECT | | | | | | |* 2 | VIEW | | 23 | 2139 | | 34 | |* 3 | WINDOW SORT PUSHED RANK | | 23 | 1058 | | 34 | |* 4 | HASH JOIN | | 23 | 1058 | | 32 | | 5 | MERGE JOIN CARTESIAN | | 61 | 2379 | | 19 | | 6 | NESTED LOOPS | | 1 | 31 | | 7 | | 7 | TABLE ACCESS BY INDEX ROWID| GRILLE | 1 | 12 | | 1 | |* 8 | INDEX UNIQUE SCAN | PK_GRILLE | 1 | | | | |* 9 | TABLE ACCESS FULL | GRILLE | 1 | 19 | | 6 | | 10 | BUFFER SORT | | 61 | 488 | | 13 | |* 11 | TABLE ACCESS FULL | DETAIL_GRILLE | 61 | 488 | | 12 | | 12 | TABLE ACCESS FULL | DETAIL_GRILLE | 9188 | 64316 | | 12 | | 3 | SORT ORDER BY | | 254K| 15M| 43M| 29790 | | 4 | UNION-ALL | | | | | | |* 5 | VIEW | | 60830 | 3445K| | 113 | | 6 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6670_245B0AE9 | 60830 | 1960K| | 113 | |* 7 | VIEW | | 193K| 12M| | 20656 | |* 8 | WINDOW SORT PUSHED RANK | | 193K| 19M| 43M| 20656 | |* 9 | HASH JOIN OUTER | | 193K| 19M| 19M| 10565 | | 10 | VIEW | | 193K| 17M| | 9935 | |* 11 | HASH JOIN | | 193K| 19M| 17M| 9935 | | 12 | VIEW | | 193K| 15M| | 624 | |* 13 | HASH JOIN OUTER | | 193K| 14M| 4160K| 624 | |* 14 | VIEW | | 60830 | 3445K| | 113 | | 15 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6670_245B0AE9 | 60830 | 1960K| | 113 | | 16 | TABLE ACCESS FULL | GRILLE_ORDRE | 101K| 1789K| | 152 | |* 17 | TABLE ACCESS FULL | ORDRE | 2484K| 47M| | 6324 | | 18 | TABLE ACCESS FULL | PRODUITS | 648 | 7128 | | 12 | -------------------------------------------------------------------------------------------------------------
Partager