Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.server -> Re: unexpected merge cartesian join
In the case someone would like to help I post also the autotrace
output.
This is for the query version:
ilcorsi_at_NOVE> select *
2 from v_filter_254
3 where upper(f2227) like upper('%test%')
4 order by f520, f184, f32
5 ;
Execution Plan
0
SELECT STATEMENT Optimizer=CHOOSE (Cost=79 Card=83 Bytes=28635)
1 0
SORT (ORDER BY) (Cost=79 Card=83 Bytes=28635)
2 1
NESTED LOOPS (OUTER) (Cost=72 Card=83 Bytes=28635)
3 2
HASH JOIN (OUTER) (Cost=72 Card=83 Bytes=26975)
4 3
HASH JOIN (OUTER) (Cost=62 Card=83 Bytes=15770)
5 4
HASH JOIN (OUTER) (Cost=54 Card=83 Bytes=13446)
6 5
HASH JOIN (OUTER) (Cost=46 Card=83 Bytes=11205)
7 6
HASH JOIN (OUTER) (Cost=38 Card=83 Bytes=8964)
8 7
HASH JOIN (OUTER) (Cost=30 Card=83 Bytes=7802) 9 8 TABLE ACCESS (FULL) OF 'A_CORSO' (Cost=7 Card=83Bytes=3071)
10 8
VIEW OF 'V_CORSI_SPESE_INT_BASE' (Cost=22 Card=195Bytes=11115)
11 10
SORT (GROUP BY) (Cost=22 Card=195 Bytes=10530) 12 11 HASH JOIN (OUTER) (Cost=18 Card=195 Bytes=10530) 13 12 TABLE ACCESS (BY INDEX ROWID) OF'M_SPESE_CORSO' 14 13
NESTED LOOPS (Cost=10 Card=188 Bytes=7708) 15 14 NESTED LOOPS (Cost=10 Card=1712Bytes=34240)
16 15
HASH JOIN (Cost=10 Card=1712 Bytes=25680) 17 16 TABLE ACCESS (FULL) OF'M_RIEPILOGO_ANNUALE' (Cost=2 Card=7 Bytes=42)
18 16
TABLE ACCESS (FULL) OF 'A_CORSO'
19 15
INDEX (UNIQUE SCAN) OF 'UI_A_CORSO_0'
INDEX (RANGE SCAN) OF 'I_M_SPESE_CORSO_0'
TABLE ACCESS (FULL) OF 'M_VAL_INT' (Cost=7Card=557 Bytes=7241)
22 7
TABLE ACCESS (FULL) OF 'A_CORSO' (Cost=7 Card=3300Bytes=46200)
23 6
TABLE ACCESS (FULL) OF 'M_VAL_STR' (Cost=7 Card=1 Bytes=27)
24 5
TABLE ACCESS (FULL) OF 'M_VAL_STR' (Cost=7 Card=1 Bytes=27)
25 4
TABLE ACCESS (FULL) OF 'M_VAL_INT' (Cost=7 Card=2 Bytes=56)
26 3
VIEW OF 'V_DIPARTIMENTI' (Cost=9 Card=2 Bytes=270)
27 26
SORT (UNIQUE) (Cost=9 Card=2 Bytes=80)
28 27
UNION-ALL 29 28
TABLE ACCESS (FULL) OF 'TAB_CDCF' (Cost=3 Card=1 Bytes=57)
30 28
TABLE ACCESS (FULL) OF 'T_DIPARTIMENTI_BUDGET' (Cost=2 Card=1 Bytes=23)
31 2
TABLE ACCESS (BY INDEX ROWID) OF 'T_AVANZAMENTO_CORSO' 32 31
INDEX (UNIQUE SCAN) OF 'PK_T_AVANZAMENTO_CORSO' (UNIQUE) Statistics
211 recursive calls 0 db block gets 3493 consistent gets 16 physical reads 0 redo size 2602 bytes sent via SQL*Net to client 499 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 3 sorts (memory) 0 sorts (disk) 12 rows processed
ilcorsi_at_NOVE> quit
And this one is the other version the one with the cartesian merge join
ilcorsi_at_NOVE> select ID,F184,X184,F520,F2227,F522,F32
2 from v_filter_254
3 where upper(f2227) like upper('%test%')
4 order by f520, f184, f32;
12 rows selected.
Execution Plan
0
SELECT STATEMENT Optimizer=CHOOSE (Cost=73 Card=83 Bytes=22908)
1 0
SORT (ORDER BY) (Cost=73 Card=83 Bytes=22908)
2 1
NESTED LOOPS (OUTER) (Cost=67 Card=83 Bytes=22908)
3 2
HASH JOIN (OUTER) (Cost=67 Card=83 Bytes=22659)
4 3
HASH JOIN (OUTER) (Cost=57 Card=83 Bytes=11454)
5 4
HASH JOIN (OUTER) (Cost=49 Card=83 Bytes=9130)
6 5
HASH JOIN (OUTER) (Cost=41 Card=83 Bytes=6889)
7 6
HASH JOIN (OUTER) (Cost=33 Card=83 Bytes=4648)
8 7
HASH JOIN (OUTER) (Cost=25 Card=83 Bytes=3486) 9 8 TABLE ACCESS (FULL) OF 'A_CORSO' (Cost=7 Card=83Bytes=3071)
10 8
VIEW OF 'V_CORSI_SPESE_INT_BASE' (Cost=17 Card=195Bytes=975)
11 10
SORT (GROUP BY) (Cost=17 Card=195 Bytes=6240) 12 11 HASH JOIN (OUTER) (Cost=14 Card=195 Bytes=6240) 13 12 NESTED LOOPS (Cost=7 Card=188 Bytes=4324) 14 13 MERGE JOIN (CARTESIAN) (Cost=7 Card=621456Bytes=11186208)
15 14
NESTED LOOPS (Cost=7 Card=1712 Bytes=22256) 16 15 TABLE ACCESS (FULL) OF 'A_CORSO' (Cost=7Card=2939 Bytes=26451)
17 15
INDEX (UNIQUE SCAN) OF'IU1_M_RIEPILOGO_ANNUALE' (UNIQUE) 18 14
BUFFER (SORT) (Cost=7 Card=363 Bytes=1815) 19 18 INDEX (FULL SCAN) OF 'I_M_SPESE_CORSO_0'
INDEX (UNIQUE SCAN) OF 'UI_A_CORSO_0'
INDEX (FAST FULL SCAN) OF 'U1_M_VAL_INT'
22 7
TABLE ACCESS (FULL) OF 'A_CORSO' (Cost=7 Card=3300Bytes=46200)
23 6
TABLE ACCESS (FULL) OF 'M_VAL_STR' (Cost=7 Card=1 Bytes=27)
24 5
TABLE ACCESS (FULL) OF 'M_VAL_STR' (Cost=7 Card=1 Bytes=27)
25 4
TABLE ACCESS (FULL) OF 'M_VAL_INT' (Cost=7 Card=2 Bytes=56)
26 3
VIEW OF 'V_DIPARTIMENTI' (Cost=9 Card=2 Bytes=270)
27 26
SORT (UNIQUE) (Cost=9 Card=2 Bytes=80)
28 27
UNION-ALL 29 28
TABLE ACCESS (FULL) OF 'TAB_CDCF' (Cost=3 Card=1 Bytes=57)
30 28
TABLE ACCESS (FULL) OF 'T_DIPARTIMENTI_BUDGET' (Cost=2 Card=1 Bytes=23)
31 2
INDEX (UNIQUE SCAN) OF 'PK_T_AVANZAMENTO_CORSO' (UNIQUE) Statistics
5167 recursive calls 0 db block gets 1062011 consistent gets 286 physical reads 0 redo size 1926 bytes sent via SQL*Net to client 499 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 181 sorts (memory) 0 sorts (disk) 12 rows processed
ilcorsi_at_NOVE> spool off
And finally this is the tkprof output of the running query (the one with the cartesian merge)
Rows Row Source Operation
------- --------------------------------------------------- 12 SORT ORDER BY 12 NESTED LOOPS OUTER 12 HASH JOIN OUTER 12 HASH JOIN OUTER 12 HASH JOIN OUTER 12 HASH JOIN OUTER 12 NESTED LOOPS OUTER 12 HASH JOIN OUTER 12 TABLE ACCESS FULL OBJ#(1397027) 167 VIEW 167 SORT GROUP BY 298 HASH JOIN OUTER 298 NESTED LOOPS 1059960 MERGE JOIN CARTESIAN 2920 NESTED LOOPS 2939 TABLE ACCESS FULL OBJ#(1397027) 2920 INDEX UNIQUE SCAN OBJ#(1374394) (object id 1374394) 1059960 BUFFER SORT 363 INDEX FULL SCAN OBJ#(1374407) (object id 1374407) 298 INDEX UNIQUE SCAN OBJ#(1754386) (object id 1754386) 557 INDEX FAST FULL SCAN OBJ#(1374423) (object id 1374423) 12 TABLE ACCESS BY INDEX ROWID OBJ#(1397027) 12 INDEX UNIQUE SCAN OBJ#(1754386) (object id 1754386) 4 TABLE ACCESS FULL OBJ#(1374428) 286 TABLE ACCESS FULL OBJ#(1374428) 553 TABLE ACCESS FULL OBJ#(1374421) 21 VIEW 21 SORT UNIQUE 21 UNION-ALL 20 TABLE ACCESS FULL OBJ#(1400837) 1 TABLE ACCESS FULL OBJ#(1374473) 12 INDEX UNIQUE SCAN OBJ#(1374458) (object id 1374458)
There is a cardinality quite higher (1059960) for the merge step than
the expexted one (621456) at the step 14.
I tried playing with the statistics of the underlying tables (removing
the histogram on the indexed columns) and I got an extimated card much
more similar to the actual but....
the merge join remains !
And it remains also my question
*why* using select * did not get the merge join and using select id ...
get it ?????
Received on Thu Dec 01 2005 - 10:20:19 CST
![]() |
![]() |