rem script: xplan_diff.sql
rem execution plan for the subquery in the CASE statement not shown in SQL_TRACE/TKPROF in 9i
rem
rem
spool xplan_diff.log
set echo on
drop table t;
drop table t2;
create table t
as
select rownum id,
'GOOD' val
from all_objects
where rownum <=20;
update t set val='BAD' where mod(id,2) = 0;
commit;
create table t2
as
select rownum id,
'TEST' val
from all_objects
where rownum <=20;
alter session set tracefile_identifier = test;
alter session set timed_statistics=true;
alter session set events '10046 trace name context forever, level 12';
set autotrace traceonly
select id,
case when val = 'GOOD' then
(select t2.val
from t, t2
where t.id = t2.id
and rownum = 1
)
else 'NO TEST'
END as IS_TEST
from t;
set autotrace off
alter session set events '10046 trace name context forever, level 12';
spool off
exit;
set doc off
doc
---- 9.2.0.8 Autotrace xplan ---------------------------
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 COUNT (STOPKEY)
2 1 MERGE JOIN
3 2 SORT (JOIN)
4 3 TABLE ACCESS (FULL) OF 'T2'
5 2 SORT (JOIN)
6 5 TABLE ACCESS (FULL) OF 'T'
7 0 TABLE ACCESS (FULL) OF 'T'
----- 9.2.0.8 tkprof -----------------------------------
Rows Row Source Operation
------- ---------------------------------------------------
20 TABLE ACCESS FULL T
------ 10.2.0.4 Autotrace xplan -------------------------------------------
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 20 | 380 | 2 (0)| 00:00:01 |
|* 1 | COUNT STOPKEY | | | | | |
|* 2 | HASH JOIN | | 20 | 640 | 5 (20)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T | 20 | 260 | 2 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| T2 | 20 | 380 | 2 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | T | 20 | 380 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(ROWNUM=1)
2 - access("T"."ID"="T2"."ID")
------ 10.2.0.4 tkprof ------------
Rows Row Source Operation
------- ---------------------------------------------------
1 COUNT STOPKEY (cr=6 pr=0 pw=0 time=1435 us)
1 HASH JOIN (cr=6 pr=0 pw=0 time=1417 us)
20 TABLE ACCESS FULL T (cr=3 pr=0 pw=0 time=109 us)
1 TABLE ACCESS FULL T2 (cr=3 pr=0 pw=0 time=64 us)
20 TABLE ACCESS FULL T (cr=4 pr=0 pw=0 time=72 us)
#
Note: in 10.2.0.4 no such problem.
I was puzzled the other day about a similar sql to that in the above test case in our 9i production database, which has two cursors with very different sql_plan_hash_value and gets_per_exections when I checked it from v$sql. But when I pulled the execution plan out from v$sql_plan, the execution plan from both cursors are exactly same. Now I understand the subquery execution plan parts are missing. The different cost is due to the join order swapped in the subquery.
No comments:
Post a Comment