Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> Outer Join reads all rows from underlying tables
Hello,
I have an outer join which runs very slowly... I've traced the SQL to determine the root cause and I've noticed that the query reads 'every' row from both of the row sets returned from one of the views in the statement.
Is this to be expected with the outer-join implementation in 8i...? E.g.
The following query:
select * from ps_rr_flat_vw
where business_unit = 'TMMF'
and tm_shop_code = 'QP1'
and tm_date = '20-FEB-03'
Produces the following plan and associated row counts:
Rows Row Source Operation
------- --------------------------------------------------- 10 NESTED LOOPS OUTER 11 NESTED LOOPS 20 VIEW PS_TM_PEFF_V_CC_VW 20 SORT UNIQUE 19 NESTED LOOPS 317 NESTED LOOPS 317 NESTED LOOPS 113 NESTED LOOPS 2 INDEX UNIQUE SCAN (object id 14431) 113 TABLE ACCESS BY INDEX ROWID PS_CMS_DPTDPTS 408 INDEX RANGE SCAN (object id 16285) 428 TABLE ACCESS BY INDEX ROWID PS_CMS_DPTSTRU 428 INDEX RANGE SCAN (object id 16287) 632 TABLE ACCESS BY INDEX ROWID PS_CMS_DPTDPTS 632 INDEX RANGE SCAN (object id 16285) 19 INDEX FAST FULL SCAN (object id 14444) 29 TABLE ACCESS BY INDEX ROWID PS_TM_PEFF_GPQTWT 29 INDEX UNIQUE SCAN (object id 22061) 10 VIEW PS_TM_PEFF_V_CCEH 1197650 SORT GROUP BY 2920935 NESTED LOOPS 74182 VIEW PS_TM_PEFF_BMRKVW2 74182 SORT UNIQUE 74181 FILTER 74182 HASH JOIN 4575 TABLE ACCESS FULL PS_CMS_DPTSTRU 26942 TABLE ACCESS FULL PS_TM_PEFF_BNCHMRK 2920935 TABLE ACCESS BY INDEX ROWID PS_TM_PEFF_GPQ 3120306 INDEX RANGE SCAN (object id 22067) 20 SORT AGGREGATE 10 FILTER 20 FILTER 10 NESTED LOOPS 20 MERGE JOIN CARTESIAN 20 NESTED LOOPS 20 NESTED LOOPS 20 INDEX UNIQUE SCAN (object id 14431) 20 TABLE ACCESS BY INDEX ROWID PS_CMS_DPTSTRU 20 INDEX RANGE SCAN (object id 16288) 20 TABLE ACCESS BY INDEX ROWID PS_CMS_DPTDPTS 20 INDEX RANGE SCAN (object id 16285) 20 SORT JOIN 10 TABLE ACCESS BY INDEX ROWID PS_CMS_DPTDPTS 20 INDEX RANGE SCAN (object id 16285) 10 INDEX RANGE SCAN (object id 14444) 10 SORT AGGREGATE 5 FIRST ROW 5 INDEX RANGE SCAN (MIN/MAX) (object id 16285) 4 SORT AGGREGATE 2 FIRST ROW 2 INDEX RANGE SCAN (MIN/MAX) (object id 16285) 10 SORT AGGREGATE 5 FIRST ROW 5 INDEX RANGE SCAN (MIN/MAX) (object id 16287) 87330 SORT AGGREGATE 43665 FIRST ROW 43665 INDEX RANGE SCAN (MIN/MAX) (object id 16287) 632 SORT AGGREGATE 316 FIRST ROW 316 INDEX RANGE SCAN (MIN/MAX) (object id 16285) 814 SORT AGGREGATE 407 FIRST ROW 407 INDEX RANGE SCAN (MIN/MAX) (object id 16285) 632 SORT AGGREGATE 316 FIRST ROW 316 INDEX RANGE SCAN (MIN/MAX) (object id 16287) ----------------------------------------------------
The main concern is the row counts in these 2 operations:
74182 VIEW PS_TM_PEFF_BMRKVW2 and
2920935 TABLE ACCESS BY INDEX ROWID PS_TM_PEFF_GPQ 3120306 INDEX RANGE SCAN (object id 22067)
These correspond approximately to the total row counts in each of the underlying tables/views...(so its reading every row)
select count(*) from PS_TM_PEFF_BMRKVW2 ==> 74181
and
select count(*) from PS_TM_PEFF_GPQ ==> 3252032
Both of these operations are part of the PS_TM_PEFF_V_CCEH view which uses an outer-join, i.e.:
SELECT a.business_unit , c.tm_shop_code , a.deptid , a.production_dt,
nvl(b.tm_earned_hours ,0) , a.total_work_time , c.tm_eff_start_date,
c.tm_contribution , c.tm_contrib_type , c.cms_labor_type
FROM
ps_tm_peff_gpqtwt a , ps_tm_peff_v_cceh b,
ps_tm_peff_v_cc_vw c
WHERE
a.business_unit = b.business_unit (+)
AND a.deptid = b.deptid (+) AND a.production_dt = b.tm_date (+) AND a.business_unit = c.business_unit AND a.deptid = c.deptid AND c.tm_eff_start_date = (
AND c1.deptid = c.deptid AND c1.tm_contrib_type = c.tm_contrib_type AND c1.cms_labor_type = c.cms_labor_type AND c1.tm_eff_start_date <= a.production_dt)
Anyone know why the optimizer would retrieve all rows for each row set despite having a very restrictive WHERE clause..?
Appologies for the long post.!
Matt Received on Fri May 07 2004 - 07:57:40 CDT