explain plan for with zz as (select t.br_org_name, t.sd_org_name, t.rw_date, t.cust_no, t.cust_name, t.zd_num, t.status, t.sett_acct, t.dr_date, t.xuhao, t.shul , t.sett_acct as agret from M_POS_CUST_SETT t where t.sett_acct not like '621028%' union all select t.br_org_name, t.sd_org_name, t.rw_date, t.cust_no, t.cust_name, t.zd_num, t.status, B.AGMT_ID sett_acct, t.dr_date, t.xuhao, t.shul , t.sett_acct as agret from M_POS_CUST_SETT t left join DWF.F_AGT_CADB_BOOK_H A on t.sett_acct = a.agmt_id and A.START_DT <= TO_DATE('2014-03-31', 'YYYY-MM-DD') AND A.END_DT > TO_DATE('2014-03-31', 'YYYY-MM-DD') AND A.MASTER_CARD_NO IS NOT NULL -- AND SUBSTR(A.CARD_NEW_STATUS, 8, 1) <> '6' LEFT JOIN DWF.F_AGT_CADB_ACCT ee on ee.START_DT <= TO_DATE('2014-03-31', 'YYYY-MM-DD') AND ee.END_DT > TO_DATE('2014-03-31', 'YYYY-MM-DD') and A.MASTER_CARD_NO = EE.AGMT_ID LEFT JOIN DWF.F_AGT_SAVB_ACCTINFO_H b on b.START_DT <= TO_DATE('2014-03-31', 'YYYY-MM-DD') AND b.END_DT > TO_DATE('2014-03-31', 'YYYY-MM-DD') and EE.ACCT_NO = B.AGMT_ID AND EE.ACCT_SEQNO = B.ACCT_SEQNO where t.sett_acct like '621028%' ) select o.FST_ORG_NAME, o.SEC_ORG_NAME, o.THD_ORG_NAME, o.FTH_ORG_NAME, o.ind_no, s.br_org_no, t.BR_ORG_NAME, t.SD_ORG_NAME, t.RW_DATE, t.CUST_NO, t.CUST_NAME, t.ZD_NUM, t.STATUS, t.SETT_ACCT, t.DR_DATE, AVG_BAL, case when s.br_org_no is not null then '正常' else '异常' end sts, t.xuhao, t.shul , s.end_acct_bal, avg_bal/t.shul avg1, s.end_acct_bal/t.shul avg2 from ( SELECT t.BR_ORG_NAME, t.SD_ORG_NAME, t.RW_DATE, t.CUST_NO, t.CUST_NAME, t.ZD_NUM, t.STATUS, t.agret SETT_ACCT, t.DR_DATE, t.xuhao, t.shul , SUM(ACCT_BAL * DAY_CNT) / max(DAY_COUNT) AVG_BAL, sum(end_bal) as end_bal FROM (SELECT t.BR_ORG_NAME, t.SD_ORG_NAME, t.RW_DATE, t.CUST_NO, t.CUST_NAME, t.ZD_NUM, t.STATUS, t.SETT_ACCT, t.DR_DATE, t.xuhao, t.shul , t.agret, XX.AGMT_ID, XX.START_DT, XX.END_DT, XX.ACCT_BAL, case when XX.END_DT > to_date('2014-03-31', 'YYYY-MM-DD') then XX.ACCT_BAL else 0 end end_bal, CASE when to_date('2014-01-01', 'YYYY-MM-DD') = to_date('2014-03-31', 'YYYY-MM-DD') then 1 when XX.START_DT < to_date('2014-01-01', 'YYYY-MM-DD') AND XX.END_DT > to_date('2014-03-31', 'YYYY-MM-DD') THEN to_date('2014-03-31', 'YYYY-MM-DD') - to_date('2014-01-01', 'YYYY-MM-DD') + 1 WHEN XX.START_DT >= to_date('2014-01-01', 'YYYY-MM-DD') AND XX.END_DT <= to_date('2014-03-31', 'YYYY-MM-DD') THEN XX.END_DT - XX.START_DT WHEN XX.START_DT < to_date('2014-01-01', 'YYYY-MM-DD') THEN XX.END_DT - to_date('2014-01-01', 'YYYY-MM-DD') WHEN XX.END_DT > to_date('2014-03-31', 'YYYY-MM-DD') THEN to_date('2014-03-31', 'YYYY-MM-DD') - XX.START_DT + 1 ELSE 0 END AS DAY_CNT, to_date('2014-03-31', 'YYYY-MM-DD') - to_date('2014-01-01', 'YYYY-MM-DD') + 1 AS DAY_COUNT FROM zz t left join DWF.F_AGT_SAVB_ACCTINFO_H XX on t.SETT_ACCT = xx.agmt_id AND ( (XX.START_DT >= to_date('2014-01-01', 'YYYY-MM-DD') AND XX.START_DT <= to_date('2014-03-31', 'YYYY-MM-DD')) or (XX.START_DT < to_date('2014-01-01', 'YYYY-MM-DD') AND XX.END_DT > to_date('2014-03-31', 'YYYY-MM-DD')) OR (XX.END_DT > to_date('2014-01-01', 'YYYY-MM-DD') AND XX.END_DT <= to_date('2014-03-31', 'YYYY-MM-DD'))) and XX.CUR_CD = 'T00CNY' WHERE t.DR_DATE = (select max(a.dr_date) from m_pos_cust_sett a)) t GROUP BY t.BR_ORG_NAME, t.SD_ORG_NAME, t.RW_DATE, t.CUST_NO, t.CUST_NAME, t.ZD_NUM, t.STATUS, t.xuhao, t.shul , t.agret, t.DR_DATE) t left join ( SELECT t.agret AGMT_ID, max(xx.acct_org) as br_org_no, sum(xx.acct_bal) end_acct_bal ,t.xuhao FROM zz t left join DWF.F_AGT_SAVB_ACCTINFO_H XX on t.sett_acct = xx.agmt_id WHERE XX.CUR_CD = 'T00CNY' and t.dr_date = (select max(a.dr_date) from m_pos_cust_sett a) AND XX.START_DT <= to_date('2014-03-31', 'YYYY-MM-DD') AND XX.End_Dt > to_date('2014-03-31', 'YYYY-MM-DD') group by t.agret ,t.xuhao ) s on t.sett_acct = s.AGMT_ID and t.xuhao = s.xuhao left join V_M_ORG_LEVEL o on s.br_org_no = o.org_id where (s.br_org_no is null or s.br_org_no in (SELECT bb.org_id FROM b_m_sys_branch bb WHERE bb.status = '1' AND bb.dept_flag NOT IN ('2') CONNECT BY PRIOR bb.id = bb.parent_id START WITH bb.org_id = 10000) ) ; select * from table(dbms_xplan.display()); SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID 0pszsnw1v97nm, child number 1 ------------------------------------- with zz as (select t.br_org_name, t.sd_org_name, t.rw_date, t.cust_no, t.cust_name, t.zd_num, t.status, t.sett_acct, t.dr_date, t.xuhao, t.shul , t.sett_acct as agret from M_POS_CUST_SETT t where t.sett_acct not like '621028%' union all select t.br_org_name, t.sd_org_name, t.rw_date, t.cust_no, t.cust_name, t.zd_num, t.status, Plan hash value: 4217052783 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | Writes | OMem | 1Mem | Used-Mem | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 5074 |00:00:17.11 | 1577K| 575K| 105 | | | | | 1 | TEMP TABLE TRANSFORMATION | | 1 | | 5074 |00:00:17.11 | 1577K| 575K| 105 | | | | | 2 | LOAD AS SELECT | | 1 | | 0 |00:00:04.60 | 353K| 15242 | 105 | 530K| 530K| 530K (0)| | 3 | UNION-ALL | | 1 | | 5400 |00:00:04.59 | 353K| 15242 | 0 | | | | |* 4 | TABLE ACCESS FULL | M_POS_CUST_SETT | 1 | 2797 | 2781 |00:00:00.01 | 91 | 0 | 0 | | | | | 5 | VIEW | | 1 | 38905 | 2619 |00:00:04.58 | 353K| 15242 | 0 | | | | | 6 | NESTED LOOPS OUTER | | 1 | 38905 | 2619 |00:00:04.58 | 353K| 15242 | 0 | | | | | 7 | VIEW | | 1 | 12736 | 2619 |00:00:03.14 | 91703 | 15242 | 0 | | | | |* 8 | HASH JOIN OUTER | | 1 | 12736 | 2619 |00:00:03.13 | 91703 | 15242 | 0 | 1073K| 1073K| 1396K (0)| | 9 | VIEW | | 1 | 2312 | 2293 |00:00:02.55 | 76457 | 0 | 0 | | | | |* 10 | HASH JOIN RIGHT OUTER | | 1 | 2312 | 2293 |00:00:02.55 | 76457 | 0 | 0 | 37M| 4938K| 38M (0)| |* 11 | INDEX RANGE SCAN | F_AGT_CADB_BOOK_H_IDX4 | 1 | 2 | 333K|00:00:02.21 | 76366 | 0 | 0 | | | | |* 12 | TABLE ACCESS FULL | M_POS_CUST_SETT | 1 | 2312 | 2293 |00:00:00.01 | 91 | 0 | 0 | | | | |* 13 | TABLE ACCESS FULL | F_AGT_CADB_ACCT | 1 | 827K| 605K|00:00:00.28 | 15246 | 15242 | 0 | | | | |* 14 | TABLE ACCESS BY INDEX ROWID | F_AGT_SAVB_ACCTINFO_H | 2619 | 3 | 2460 |00:00:01.44 | 261K| 0 | 0 | | | | |* 15 | INDEX RANGE SCAN | F_AGT_SAVB_ACCTINFO_H_IDX2 | 2619 | 1 | 253K|00:00:00.16 | 8106 | 0 | 0 | | | | |* 16 | FILTER | | 1 | | 5074 |00:00:12.50 | 1223K| 560K| 0 | | | | | 17 | NESTED LOOPS OUTER | | 1 | 1 | 5074 |00:00:12.44 | 1222K| 560K| 0 | | | | |* 18 | HASH JOIN OUTER | | 1 | 1 | 5074 |00:00:12.31 | 1217K| 560K| 0 | 1538K| 1070K| 1437K (0)| | 19 | VIEW | | 1 | 1 | 5074 |00:00:04.16 | 657K| 105 | 0 | | | | | 20 | HASH GROUP BY | | 1 | 1 | 5074 |00:00:04.15 | 657K| 105 | 0 | 24M| 4065K| 1492K (0)| | 21 | NESTED LOOPS OUTER | | 1 | 250K| 94941 |00:00:03.86 | 657K| 105 | 0 | | | | |* 22 | VIEW | | 1 | 41702 | 5400 |00:00:00.03 | 200 | 105 | 0 | | | | | 23 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6F46_6CB3C16D | 1 | 41702 | 5400 |00:00:00.02 | 109 | 105 | 0 | | | | | 24 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 91 | 0 | 0 | | | | | 25 | TABLE ACCESS FULL | M_POS_CUST_SETT | 1 | 5109 | 5074 |00:00:00.01 | 91 | 0 | 0 | | | | | 26 | VIEW | | 5400 | 6 | 94736 |00:00:03.80 | 656K| 0 | 0 | | | | |* 27 | TABLE ACCESS BY INDEX ROWID | F_AGT_SAVB_ACCTINFO_H | 5400 | 6 | 94736 |00:00:03.76 | 656K| 0 | 0 | | | | |* 28 | INDEX RANGE SCAN | SYS_C0054556 | 5400 | 19 | 637K|00:00:00.41 | 18975 | 0 | 0 | | | | | 29 | VIEW | | 1 | 1 | 4872 |00:00:08.13 | 560K| 560K| 0 | | | | | 30 | HASH GROUP BY | | 1 | 1 | 4872 |00:00:08.13 | 560K| 560K| 0 | 1259K| 1259K| 6786K (0)| |* 31 | HASH JOIN | | 1 | 126K| 5195 |00:00:08.11 | 560K| 560K| 0 | 1291K| 1291K| 2793K (0)| |* 32 | VIEW | | 1 | 41702 | 5400 |00:00:00.01 | 197 | 0 | 0 | | | | | 33 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6F46_6CB3C16D | 1 | 41702 | 5400 |00:00:00.01 | 106 | 0 | 0 | | | | | 34 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 91 | 0 | 0 | | | | | 35 | TABLE ACCESS FULL | M_POS_CUST_SETT | 1 | 5109 | 5074 |00:00:00.01 | 91 | 0 | 0 | | | | |* 36 | TABLE ACCESS FULL | F_AGT_SAVB_ACCTINFO_H | 1 | 2301K| 1287K|00:00:07.44 | 560K| 560K| 0 | | | | | 37 | VIEW PUSHED PREDICATE | V_M_ORG_LEVEL | 5074 | 1 | 4872 |00:00:00.12 | 5085 | 0 | 0 | | | | | 38 | NESTED LOOPS OUTER | | 5074 | 1 | 4872 |00:00:00.11 | 5085 | 0 | 0 | | | | | 39 | NESTED LOOPS OUTER | | 5074 | 1 | 4872 |00:00:00.09 | 4440 | 0 | 0 | | | | | 40 | NESTED LOOPS OUTER | | 5074 | 1 | 4872 |00:00:00.06 | 3462 | 0 | 0 | | | | |* 41 | TABLE ACCESS BY INDEX ROWID | B_M_SYS_BRANCH | 5074 | 1 | 4872 |00:00:00.04 | 2270 | 0 | 0 | | | | |* 42 | INDEX RANGE SCAN | IND_BRANCH_001 | 5074 | 1 | 4872 |00:00:00.02 | 652 | 0 | 0 | | | | | 43 | TABLE ACCESS BY INDEX ROWID | B_M_SYS_BRANCH | 4872 | 1 | 4872 |00:00:00.02 | 1192 | 0 | 0 | | | | |* 44 | INDEX RANGE SCAN | IND_BRANCH_002 | 4872 | 1 | 4872 |00:00:00.01 | 652 | 0 | 0 | | | | | 45 | TABLE ACCESS BY INDEX ROWID | B_M_SYS_BRANCH | 4872 | 1 | 4872 |00:00:00.02 | 978 | 0 | 0 | | | | |* 46 | INDEX RANGE SCAN | IND_BRANCH_002 | 4872 | 1 | 4872 |00:00:00.01 | 652 | 0 | 0 | | | | | 47 | TABLE ACCESS BY INDEX ROWID | B_M_SYS_BRANCH | 4872 | 1 | 594 |00:00:00.01 | 645 | 0 | 0 | | | | |* 48 | INDEX RANGE SCAN | IND_BRANCH_002 | 4872 | 1 | 594 |00:00:00.01 | 377 | 0 | 0 | | | | |* 49 | FILTER | | 143 | | 143 |00:00:00.05 | 858 | 0 | 0 | | | | |* 50 | CONNECT BY NO FILTERING WITH SW (UNIQUE)| | 143 | | 7094 |00:00:00.05 | 858 | 0 | 0 | | | | | 51 | TABLE ACCESS FULL | B_M_SYS_BRANCH | 143 | 152 | 21879 |00:00:00.01 | 858 | 0 | 0 | | | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - filter("T"."SETT_ACCT" NOT LIKE '621028%') 8 - access("A"."MASTER_CARD_NO"="EE"."AGMT_ID") 10 - access("T"."SETT_ACCT"="A"."AGMT_ID") 11 - access("A"."AGMT_ID" LIKE '621028%' AND "A"."END_DT">TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "A"."START_DT"<=TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) filter(("A"."END_DT">TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "A"."AGMT_ID" LIKE '621028%' AND "A"."MASTER_CARD_NO" IS NOT NULL AND "A"."START_DT"<=TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))) 12 - filter("T"."SETT_ACCT" LIKE '621028%') 13 - filter(("EE"."START_DT"<=TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "EE"."END_DT">TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))) 14 - filter(("B"."END_DT">TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "B"."START_DT"<=TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))) 15 - access("EE"."ACCT_NO"="B"."AGMT_ID" AND "EE"."ACCT_SEQNO"="B"."ACCT_SEQNO") 16 - filter(("S"."BR_ORG_NO" IS NULL OR IS NOT NULL)) 18 - access("T"."XUHAO"="S"."XUHAO" AND "T"."SETT_ACCT"="S"."AGMT_ID") 22 - filter("T"."DR_DATE"=) 27 - filter(((("XX"."END_DT">TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "XX"."START_DT"<TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) OR ("XX"."START_DT">=TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "XX"."START_DT"<=TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) OR ("XX"."END_DT">TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "XX"."END_DT"<=TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))) AND "XX"."CUR_CD"='T00CNY')) 28 - access("T"."SETT_ACCT"="XX"."AGMT_ID") 31 - access("T"."SETT_ACCT"="XX"."AGMT_ID") 32 - filter("T"."DR_DATE"=) 36 - filter(("XX"."END_DT">TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "XX"."START_DT"<=TO_DATE(' 2014-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "XX"."CUR_CD"='T00CNY')) 41 - filter((TO_NUMBER("A"."ORG_TYPE")=1 AND "A"."DEPT_FLAG"<>'2')) 42 - access("A"."ORG_ID"="S"."BR_ORG_NO") 44 - access("A"."PARENT_ID"="B"."ID") 46 - access("B"."PARENT_ID"="C"."ID") 48 - access("C"."PARENT_ID"="D"."ID") 49 - filter(("BB"."ORG_ID"=:B1 AND "BB"."STATUS"=1 AND "BB"."DEPT_FLAG"<>'2')) 50 - access("BB"."PARENT_ID"=PRIOR NULL) filter(TO_NUMBER("BB"."ORG_ID")=10000) 112 rows selected. | 22 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6F41_6CB3C16D | 1 | 41702 | 5400 |00:00:00.03 | 109 | 105 | 0 | | | | | 23 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 91 | 0 | 0 | | | | | 24 | TABLE ACCESS FULL | M_POS_CUST_SETT | 1 | 5109 | 5074 |00:00:00.01 | 91 | 0 | 0 | | | | 这里的5400行是怎么计算的呢? with A as (select /*+ materialize */ * from (select t.br_org_name, t.sd_org_name, t.rw_date, t.cust_no, t.cust_name, t.zd_num, t.status, t.sett_acct, t.dr_date, t.xuhao, t.shul , t.sett_acct as agret from M_POS_CUST_SETT t where t.sett_acct not like '621028%' union all select /*+ use_hash(EE B) */ t.br_org_name, t.sd_org_name, t.rw_date, t.cust_no, t.cust_name, t.zd_num, t.status, B.AGMT_ID sett_acct, t.dr_date, t.xuhao, t.shul , t.sett_acct as agret from M_POS_CUST_SETT t left join DWF.F_AGT_CADB_BOOK_H A on t.sett_acct = a.agmt_id and A.START_DT <= TO_DATE('2014-03-31', 'YYYY-MM-DD') AND A.END_DT > TO_DATE('2014-03-31', 'YYYY-MM-DD') AND A.MASTER_CARD_NO IS NOT NULL -- AND SUBSTR(A.CARD_NEW_STATUS, 8, 1) <> '6' LEFT JOIN DWF.F_AGT_CADB_ACCT ee on ee.START_DT <= TO_DATE('2014-03-31', 'YYYY-MM-DD') AND ee.END_DT > TO_DATE('2014-03-31', 'YYYY-MM-DD') and A.MASTER_CARD_NO = EE.AGMT_ID LEFT JOIN DWF.F_AGT_SAVB_ACCTINFO_H b on b.START_DT <= TO_DATE('2014-03-31', 'YYYY-MM-DD') AND b.END_DT > TO_DATE('2014-03-31', 'YYYY-MM-DD') and EE.ACCT_NO = B.AGMT_ID AND EE.ACCT_SEQNO = B.ACCT_SEQNO where t.sett_acct like '621028%' )) select count(*) from A where A.DR_DATE = (select max(a.dr_date) from m_pos_cust_sett a) --5400