Bonjour,
J’ai un CAS 1 (voir ci-dessous) que je pensais optimiser en écrivant la requête comme indiqué dans le CAS 2 (voir ci-dessous).Et à priori, en lisant le plan d’exécution, je crois comprendre que c’est pire. Pourriez-vous m’expliquer pourquoi ?
Note :
- Le but de la discussion n’est pas de modifier la requête mais bien de comprendre pourquoi la version du CAS 2 ne semble pas, selon le plan d’exécution, plus performante.
- Je n’ai pas accès aux statistiques mais bon sang de bonsoir, je pense que le «consistent gets » du CAS 2 doit être inférieur à celui du CAS 1 car ma sous-requête de la clause WITH est exécutée qu’une seule fois alors que celle du CAS 1 , 3 fois.
TABLES
CAS 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CREATE TABLE T1 (T1_ID01 VARCHAR2(2),T1_ID02 VARCHAR2(2),T1_ID03 VARCHAR2(2),T1_ID04 VARCHAR2(2),T1_COL01 VARCHAR2(2),T1_COL02 VARCHAR2(2),T1_COL03 NUMBER,PRIMARY KEY (T1_ID01,T1_ID02,T1_ID03,T1_ID04)); CREATE TABLE T2 (T2_ID01 VARCHAR2(2),T2_ID02 VARCHAR2(2),T2_ID03 VARCHAR2(2),T2_COL01 VARCHAR2(2),T2_COL02 VARCHAR2(2),PRIMARY KEY (T2_ID01,T2_ID02,T2_ID03));
CAS 2
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 ( ( SELECT DISTINCT T1_ID03,T1_COL01 FROM T1 WHERE T1_ID01='A' AND T1_ID02 = 'B' AND T1_COL02 = 'C' AND T1_COL03 > 100 AND T1_ID03 IN (SELECT T2_ID01 FROM T2 WHERE T2_ID01='A' AND T2_ID02 = 'B') ) ) UNION ( ( SELECT DISTINCT T1_ID03,T1_COL01 FROM T1 WHERE T1_ID01='A' AND T1_ID02 = 'B' AND T1_COL02 = 'D' AND T1_COL03 > 252 AND T1_ID03 IN (SELECT DISTINCT T2_ID01 FROM T2 WHERE T2_ID01='A' AND T2_ID02 = 'B') ) ) UNION ( ( SELECT DISTINCT T1_ID03,T1_COL01 FROM T1 WHERE T1_ID01='A' AND T1_ID02 = 'B' AND T1_COL02 = 'F' AND T1_COL03 > 586 AND T1_ID03 IN (SELECT T2_ID01 FROM T2 WHERE T2_ID01='A' AND T2_ID02 = 'B') ) ) ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 15 | 510 | 15 (74)| 00:12:01 | | 1 | SORT UNIQUE | | 15 | 510 | 15 (74)| 00:12:01 | | 2 | UNION-ALL | | | | | | | 3 | MERGE JOIN CARTESIAN | | 5 | 170 | 4 (0)| 00:03:13 | |* 4 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 28 | 3 (0)| 00:02:25 | |* 5 | INDEX RANGE SCAN | SYS_C00592542 | 1 | | 2 (0)| 00:01:37 | | 6 | BUFFER SORT | | 1000 | 6000 | 1 (0)| 00:00:49 | |* 7 | INDEX RANGE SCAN | SYS_C00592543 | 1000 | 6000 | 1 (0)| 00:00:49 | | 8 | MERGE JOIN CARTESIAN | | 5 | 170 | 4 (0)| 00:03:13 | |* 9 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 28 | 3 (0)| 00:02:25 | |* 10 | INDEX RANGE SCAN | SYS_C00592542 | 1 | | 2 (0)| 00:01:37 | | 11 | BUFFER SORT | | 1000 | 6000 | 1 (0)| 00:00:49 | |* 12 | INDEX RANGE SCAN | SYS_C00592543 | 1000 | 6000 | 1 (0)| 00:00:49 | | 13 | MERGE JOIN CARTESIAN | | 5 | 170 | 4 (0)| 00:03:13 | |* 14 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 28 | 3 (0)| 00:02:25 | |* 15 | INDEX RANGE SCAN | SYS_C00592542 | 1 | | 2 (0)| 00:01:37 | | 16 | BUFFER SORT | | 1000 | 6000 | 1 (0)| 00:00:49 | |* 17 | INDEX RANGE SCAN | SYS_C00592543 | 1000 | 6000 | 1 (0)| 00:00:49 | ------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 4 - filter("T1_COL02"='C' AND "T1_COL03">100) 5 - access("T1_ID01"='A' AND "T1_ID02"='B' AND "T1_ID03"='A') 7 - access("T2_ID01"='A' AND "T2_ID02"='B') 9 - filter("T1_COL02"='D' AND "T1_COL03">252) 10 - access("T1_ID01"='A' AND "T1_ID02"='B' AND "T1_ID03"='A') 12 - access("T2_ID01"='A' AND "T2_ID02"='B') 14 - filter("T1_COL02"='F' AND "T1_COL03">586) 15 - access("T1_ID01"='A' AND "T1_ID02"='B' AND "T1_ID03"='A') 17 - access("T2_ID01"='A' AND "T2_ID02"='B')
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 WITH T3 AS (SELECT T2_ID01 FROM T2 WHERE T2_ID01='A' AND T2_ID02 = 'B') ( ( SELECT DISTINCT T1_ID03,T1_COL01 FROM T1 WHERE T1_ID01='A' AND T1_ID02 = 'B' AND T1_COL02 = 'C' AND T1_COL03 > 100 AND T1_ID03 IN (SELECT T2_ID01 FROM T3) ) ) UNION ( ( SELECT DISTINCT T1_ID03,T1_COL01 FROM T1 WHERE T1_ID01='A' AND T1_ID02 = 'B' AND T1_COL02 = 'D' AND T1_COL03 > 252 AND T1_ID03 IN (SELECT T2_ID01 FROM T3) ) ) UNION ( ( SELECT DISTINCT T1_ID03,T1_COL01 FROM T1 WHERE T1_ID01='A' AND T1_ID02 = 'B' AND T1_COL02 = 'F' AND T1_COL03 > 586 AND T1_ID03 IN (SELECT T2_ID01 FROM T3) ) ) --------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 3 | 93 | 20 (75)| 00:15:37 | | 1 | TEMP TABLE TRANSFORMATION | | | | | | | 2 | LOAD AS SELECT | SYS_TEMP_0FD9D6679_3A8CCF3C | | | | | |* 3 | INDEX RANGE SCAN | SYS_C00592543 | 1000 | 6000 | 2 (0)| 00:01:37 | | 4 | SORT UNIQUE | | 3 | 93 | 20 (75)| 00:15:37 | | 5 | UNION-ALL | | | | | | |* 6 | HASH JOIN | | 1 | 31 | 6 (17)| 00:04:25 | |* 7 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 28 | 3 (0)| 00:02:25 | |* 8 | INDEX RANGE SCAN | SYS_C00592542 | 160 | | 2 (0)| 00:01:37 | | 9 | VIEW | | 1000 | 3000 | 2 (0)| 00:01:37 | | 10 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6679_3A8CCF3C | 1000 | 3000 | 2 (0)| 00:01:37 | |* 11 | HASH JOIN | | 1 | 31 | 6 (17)| 00:04:25 | |* 12 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 28 | 3 (0)| 00:02:25 | |* 13 | INDEX RANGE SCAN | SYS_C00592542 | 160 | | 2 (0)| 00:01:37 | | 14 | VIEW | | 1000 | 3000 | 2 (0)| 00:01:37 | | 15 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6679_3A8CCF3C | 1000 | 3000 | 2 (0)| 00:01:37 | |* 16 | HASH JOIN | | 1 | 31 | 6 (17)| 00:04:25 | |* 17 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 28 | 3 (0)| 00:02:25 | |* 18 | INDEX RANGE SCAN | SYS_C00592542 | 160 | | 2 (0)| 00:01:37 | | 19 | VIEW | | 1000 | 3000 | 2 (0)| 00:01:37 | | 20 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6679_3A8CCF3C | 1000 | 3000 | 2 (0)| 00:01:37 | --------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("T2_ID01"='A' AND "T2_ID02"='B') 6 - access("T1_ID03"="T2_ID01") 7 - filter("T1_COL02"='C' AND "T1_COL03">100) 8 - access("T1_ID01"='A' AND "T1_ID02"='B') 11 - access("T1_ID03"="T2_ID01") 12 - filter("T1_COL02"='D' AND "T1_COL03">252) 13 - access("T1_ID01"='A' AND "T1_ID02"='B') 16 - access("T1_ID03"="T2_ID01") 17 - filter("T1_COL02"='F' AND "T1_COL03">586) 18 - access("T1_ID01"='A' AND "T1_ID02"='B')
Partager