利用no_merge优化

时间:2023-03-10 02:50:56
利用no_merge优化
SQL> select a.unit3_code 机构编码,
2 a.unit3_name 机构名称,
3 a.dept1_code 部门编码,
4 a.dept1_name 部门名称,
5 a.mgr_code 客户经理编码,
6 a.mgr_name 客户经理名称,
7 b.base 基数
8 from s_pm_mgr_dept_rela a,
9 (select t2.mgr_code, sum(T1.avg * t2.share_rate / 100) / 10000 base
10 from (select acct_no_pk,
11 (SUM(DECODE(T1.DATA_DATE, '20121217', T1.Y_ADD_AF, 0)) -
12 SUM(DECODE(T1.DATA_DATE, '20120101', T1.Y_ADD_AF, 0)) +
13 SUM(DECODE(T1.DATA_DATE,
14 '20120101',
15 T1.ADJUST_AMT_AF,
16 0))) /
17 PKG_UF_BANK.FN_GETDAYS('20120101', '20121217') AVG
18 from t_pm_acct_dtl_af t1
19 where 1 = 1
20 and t1.data_date in ('20120101', '20121217')
21 and acct_flag = 'DEPOSIT'
22 and t1.cur_code = 1
23 and substr(flag, 1, 1) = '1'
24 and substr(flag, 4, 1) = '1'
25 and t1.dept1_code <> '999999999'
26 group by acct_no_pk) t1,
27 (select t3.acct_no_pk as acct_no_pk,
28 NVL(t2.cm_code, nvl(T3.MGR_CODE, 'xxxxxx')) as mgr_code,
29 decode(T1.SHARE_RATE, '', 100, T1.SHARE_RATE) as share_rate
30 from t_pm_acct_dtl t3,
31 bap_cm_account t1,
32 bap_cm_psndoc t2,
33 bap_nctobapdept t4
34 where 1 = 1
35 and t1.account(+) = t3.acct_no_pk
36 and decode(t1.seal_flag(+), '', 'N', t1.seal_flag(+)) = 'N'
37 and replace(t1.effect_date(+), '-') <= '20121217'
38 and replace(decode(t1.seal_date(+),
39 '',
40 pkg_uf_bank.FN_GETNEXTDAY('20121217',
41 'M'),
42 t1.seal_date(+)),
43 '-') > '20121217'
44 and decode(t1.dr(+), '', 0, t1.dr(+)) = 0
45 and t1.pk_cm_psndoc = t2
46 .pk_cm_psndoc(+)
47 and decode(t2.dr(+), '', 0, t2.dr(+)) = 0
48 and t2.pk_dept = t4.pk_nctobapdept(+)
49 and t4.deptcode(+) <> '999999999'
50 and t3.data_date = '20121217'
51 and t3.acct_flag = 'DEPOSIT') t2
52 Where t1.acct_no_pk = t2.acct_no_pk
53 group by t2.mgr_code) b
54 where a.mgr_code = b.mgr_code
55 and a.dept1_code <> '999999999'
56 and a.dept1_code = '18605'
57 and a.unit3_code = '18601'
58 and 1 = 1
59 and a.mgr_code IN ('00798', '00817')
60 order by 1, 3, 5
61 ; Execution Plan
----------------------------------------------------------
Plan hash value: 1749794338 -------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 288 | 11414 (15)| 00:00:33 | | |
| 1 | SORT GROUP BY | | 1 | 288 | 11414 (15)| 00:00:33 | | |
|* 2 | HASH JOIN OUTER | | 1 | 288 | 11413 (15)| 00:00:33 | | |
|* 3 | FILTER | | | | | | | |
| 4 | NESTED LOOPS OUTER | | 1 | 258 | 11408 (15)| 00:00:33 | | |
| 5 | NESTED LOOPS OUTER | | 1 | 207 | 11407 (15)| 00:00:33 | | |
| 6 | NESTED LOOPS | | 1 | 139 | 11402 (15)| 00:00:33 | | |
| 7 | MERGE JOIN CARTESIAN | | 1 | 98 | 11398 (15)| 00:00:33 | | |
| 8 | INLIST ITERATOR | | | | | | | |
|* 9 | TABLE ACCESS BY INDEX ROWID | S_PM_MGR_DEPT_RELA | 1 | 63 | 3 (0)| 00:00:01 | | |
|* 10 | INDEX RANGE SCAN | MGR_DEPT_RELA_IDX5 | 1 | | 2 (0)| 00:00:01 | | |
| 11 | BUFFER SORT | | 93 | 3255 | 11396 (15)| 00:00:33 | | |
| 12 | VIEW | | 93 | 3255 | 11396 (15)| 00:00:33 | | |
| 13 | HASH GROUP BY | | 93 | 5487 | 11396 (15)| 00:00:33 | | |
| 14 | PARTITION LIST INLIST | | 93 | 5487 | 11395 (15)| 00:00:33 |KEY(I) |KEY(I) |
|* 15 | TABLE ACCESS FULL | T_PM_ACCT_DTL_AF | 93 | 5487 | 11395 (15)| 00:00:33 |KEY(I) |KEY(I) |
| 16 | PARTITION LIST SINGLE | | 1 | 41 | 4 (0)| 00:00:01 | KEY | KEY |
|* 17 | TABLE ACCESS BY LOCAL INDEX ROWID| T_PM_ACCT_DTL | 1 | 41 | 4 (0)| 00:00:01 | 352 | 352 |
|* 18 | INDEX RANGE SCAN | ACCT_DTL_IDX1 | 2 | | 2 (0)| 00:00:01 | 352 | 352 |
|* 19 | TABLE ACCESS BY INDEX ROWID | BAP_CM_ACCOUNT | 1 | 68 | 5 (0)| 00:00:01 | | |
|* 20 | INDEX RANGE SCAN | IDX_BAP_CM_ACCOUNT | 2 | | 2 (0)| 00:00:01 | | |
|* 21 | TABLE ACCESS BY INDEX ROWID | BAP_CM_PSNDOC | 1 | 51 | 1 (0)| 00:00:01 | | |
|* 22 | INDEX UNIQUE SCAN | PK_BAP_CM_PSNDOC | 1 | | 0 (0)| 00:00:01 | | |
|* 23 | TABLE ACCESS FULL | BAP_NCTOBAPDEPT | 609 | 18270 | 4 (0)| 00:00:01 | | |
------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("T2"."PK_DEPT"="T4"."PK_NCTOBAPDEPT"(+))
3 - filter("A"."MGR_CODE"=NVL("T2"."CM_CODE",NVL("T3"."MGR_CODE",'xxxxxx')) AND
(NVL("T2"."CM_CODE",NVL("T3"."MGR_CODE",'xxxxxx'))='00798' OR
NVL("T2"."CM_CODE",NVL("T3"."MGR_CODE",'xxxxxx'))='00817'))
9 - filter("A"."DEPT1_CODE"='18605' AND "A"."DEPT1_CODE"<>'999999999')
10 - access("A"."UNIT3_CODE"='18601' AND ("A"."MGR_CODE"='00798' OR "A"."MGR_CODE"='00817'))
15 - filter("ACCT_FLAG"='DEPOSIT' AND SUBSTR("FLAG",1,1)='1' AND SUBSTR("FLAG",4,1)='1' AND
"T1"."DEPT1_CODE"<>'999999999' AND TO_NUMBER("T1"."CUR_CODE")=1)
17 - filter("T3"."ACCT_FLAG"='DEPOSIT')
18 - access("T3"."DATA_DATE"=20121217 AND "T1"."ACCT_NO_PK"="T3"."ACCT_NO_PK")
19 - filter(DECODE("T1"."SEAL_FLAG"(+),'','N',"T1"."SEAL_FLAG"(+))='N' AND
REPLACE("T1"."EFFECT_DATE"(+),'-')<='20121217' AND DECODE(TO_CHAR("T1"."DR"(+)),'',0,"T1"."DR"(+))=0 AND
REPLACE(DECODE("T1"."SEAL_DATE"(+),'',"PKG_UF_BANK"."FN_GETNEXTDAY"('20121217','M'),"T1"."SEAL_DATE"(+)),'-')>'20121217
')
20 - access("T1"."ACCOUNT"(+)="T3"."ACCT_NO_PK")
21 - filter(DECODE(TO_CHAR("T2"."DR"(+)),'',0,"T2"."DR"(+))=0)
22 - access("T1"."PK_CM_PSNDOC"="T2"."PK_CM_PSNDOC"(+))
23 - filter("T4"."DEPTCODE"(+)<>'999999999') Statistics
----------------------------------------------------------
214 recursive calls
0 db block gets
11912102 consistent gets
122578 physical reads
13516 redo size
1064 bytes sent via SQL*Net to client
1625 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
2 rows processed
select count(*) from S_PM_MGR_DEPT_RELA A where ("A"."UNIT3_CODE"='18601' AND ("A"."MGR_CODE"='00798' OR "A"."MGR_CODE"='00817'))
and ("A"."DEPT1_CODE"='18605' AND "A"."DEPT1_CODE"<>'999999999');
---返回2条记录 (select acct_no_pk,
11 (SUM(DECODE(T1.DATA_DATE, '20121217', T1.Y_ADD_AF, 0)) -
12 SUM(DECODE(T1.DATA_DATE, '20120101', T1.Y_ADD_AF, 0)) +
13 SUM(DECODE(T1.DATA_DATE,
14 '20120101',
15 T1.ADJUST_AMT_AF,
16 0))) /
17 PKG_UF_BANK.FN_GETDAYS('20120101', '20121217') AVG
18 from t_pm_acct_dtl_af t1
19 where 1 = 1
20 and t1.data_date in ('20120101', '20121217')
21 and acct_flag = 'DEPOSIT'
22 and t1.cur_code = 1
23 and substr(flag, 1, 1) = '1'
24 and substr(flag, 4, 1) = '1'
25 and t1.dept1_code <> '999999999'
26 group by acct_no_pk) t1 (select t3.acct_no_pk as acct_no_pk,
28 NVL(t2.cm_code, nvl(T3.MGR_CODE, 'xxxxxx')) as mgr_code,
29 decode(T1.SHARE_RATE, '', 100, T1.SHARE_RATE) as share_rate
30 from t_pm_acct_dtl t3,
31 bap_cm_account t1,
32 bap_cm_psndoc t2,
33 bap_nctobapdept t4
34 where 1 = 1
35 and t1.account(+) = t3.acct_no_pk
36 and decode(t1.seal_flag(+), '', 'N', t1.seal_flag(+)) = 'N'
37 and replace(t1.effect_date(+), '-') <= '20121217'
38 and replace(decode(t1.seal_date(+),
39 '',
40 pkg_uf_bank.FN_GETNEXTDAY('20121217',
41 'M'),
42 t1.seal_date(+)),
43 '-') > '20121217'
44 and decode(t1.dr(+), '', 0, t1.dr(+)) = 0
45 and t1.pk_cm_psndoc = t2
46 .pk_cm_psndoc(+)
47 and decode(t2.dr(+), '', 0, t2.dr(+)) = 0
48 and t2.pk_dept = t4.pk_nctobapdept(+)
49 and t4.deptcode(+) <> '999999999'
50 and t3.data_date = '20121217'
51 and t3.acct_flag = 'DEPOSIT') t2 | 12 | VIEW | | 93 | 3255 | 11396 (15)| 00:00:33 | | |
| 13 | HASH GROUP BY | | 93 | 5487 | 11396 (15)| 00:00:33 | | |
| 14 | PARTITION LIST INLIST | | 93 | 5487 | 11395 (15)| 00:00:33 |KEY(I) |KEY(I) |
|* 15 | TABLE ACCESS FULL | T_PM_ACCT_DTL_AF | 93 | 5487 | 11395 (15)| 00:00:33 |KEY(I) |KEY(I) |
| 16 | PARTITION LIST SINGLE | | 1 | 41 | 4 (0)| 00:00:01 | KEY | KEY |
|* 17 | TABLE ACCESS BY LOCAL INDEX ROWID| T_PM_ACCT_DTL | 1 | 41 | 4 (0)| 00:00:01 | 352 | 352 |
|* 18 | INDEX RANGE SCAN | ACCT_DTL_IDX1 | 2 | | 2 (0)| 00:00:01 | 352 | 352 |
|* 19 | TABLE ACCESS BY INDEX ROWID | BAP_CM_ACCOUNT | 1 | 68 | 5 (0)| 00:00:01 | | |
|* 20 | INDEX RANGE SCAN | IDX_BAP_CM_ACCOUNT | 2 | | 2 (0)| 00:00:01 | | |
|* 21 | TABLE ACCESS BY INDEX ROWID | BAP_CM_PSNDOC | 1 | 51 | 1 (0)| 00:00:01 | | |
|* 22 | INDEX UNIQUE SCAN | PK_BAP_CM_PSNDOC | 1 | | 0 (0)| 00:00:01 | | |
|* 23 | TABLE ACCESS FULL | BAP_NCTOBAPDEPT | 609 | 18270 | 4 (0)| 00:00:01 | | |
------------------------------------------------------------------------------------------------------------------------------- 可以看到t1视图没有展开,但是t2视图确被展开了,尝试让t2视图不展开 SQL> select a.unit3_code 机构编码,
2 a.unit3_name 机构名称,
3 a.dept1_code 部门编码,
4 a.dept1_name 部门名称,
5 a.mgr_code 客户经理编码,
6 a.mgr_name 客户经理名称,
7 b.base 基数
8 from s_pm_mgr_dept_rela a,
9 (select /*+ no_merge(t2)*/ t2.mgr_code, sum(T1.avg * t2.share_rate / 100) / 10000 base
10 from (select acct_no_pk,
11 (SUM(DECODE(T1.DATA_DATE, '20121217', T1.Y_ADD_AF, 0)) -
12 SUM(DECODE(T1.DATA_DATE, '20120101', T1.Y_ADD_AF, 0)) +
13 SUM(DECODE(T1.DATA_DATE,
14 '20120101',
15 T1.ADJUST_AMT_AF,
16 0))) /
17 PKG_UF_BANK.FN_GETDAYS('20120101', '20121217') AVG
18 from t_pm_acct_dtl_af t1
19 where 1 = 1
20 and t1.data_date in ('20120101', '20121217')
21 and acct_flag = 'DEPOSIT'
22 and t1.cur_code = 1
23 and substr(flag, 1, 1) = '1'
24 and substr(flag, 4, 1) = '1'
25 and t1.dept1_code <> '999999999'
26 group by acct_no_pk) t1,
27 (select
28 t3.acct_no_pk as acct_no_pk,
29 NVL(t2.cm_code, nvl(T3.MGR_CODE, 'xxxxxx')) as mgr_code,
30 decode(T1.SHARE_RATE, '', 100, T1.SHARE_RATE) as share_rate
31 from t_pm_acct_dtl t3,
32 bap_cm_account t1,
33 bap_cm_psndoc t2,
34 bap_nctobapdept t4
35 where 1 = 1
36 and t1.account(+) = t3.acct_no_pk
37 and decode(t1.seal_flag(+), '', 'N', t1.seal_flag(+)) = 'N'
38 and replace(t1.effect_date(+), '-') <= '20121217'
39 and replace(decode(t1.seal_date(+),
40 '',
41 pkg_uf_bank.FN_GETNEXTDAY('20121217',
42 'M'),
43 t1.seal_date(+)),
44 '-') > '20121217'
45 and decode(t1.dr(+), '', 0, t1.dr(+)) = 0
46 and t1.pk_cm_psndoc = t2
47 .pk_cm_psndoc(+)
48 and decode(t2.dr(+), '', 0, t2.dr(+)) = 0
49 and t2.pk_dept = t4.pk_nctobapdept(+)
50 and t4.deptcode(+) <> '999999999'
51 and t3.data_date = '20121217'
52 and t3.acct_flag = 'DEPOSIT') t2
53 Where t1.acct_no_pk = t2.acct_no_pk
54 group by t2.mgr_code) b
55 where a.mgr_code = b.mgr_code
56 and a.dept1_code <> '999999999'
57 and a.dept1_code = '18605'
58 and a.unit3_code = '18601'
59 and 1 = 1
60 and a.mgr_code IN ('00798', '00817')
61 order by 1, 3, 5
62 ; Execution Plan
----------------------------------------------------------
Plan hash value: 74438866 ----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 150 | 19483 (14)| 00:00:57 | | |
| 1 | SORT GROUP BY | | 1 | 150 | 19483 (14)| 00:00:57 | | |
|* 2 | HASH JOIN | | 1 | 150 | 19482 (14)| 00:00:57 | | |
|* 3 | HASH JOIN | | 1 | 115 | 8086 (13)| 00:00:24 | | |
| 4 | INLIST ITERATOR | | | | | | | |
|* 5 | TABLE ACCESS BY INDEX ROWID| S_PM_MGR_DEPT_RELA | 1 | 63 | 3 (0)| 00:00:01 | | |
|* 6 | INDEX RANGE SCAN | MGR_DEPT_RELA_IDX5 | 1 | | 2 (0)| 00:00:01 | | |
| 7 | VIEW | | 12519 | 635K| 8082 (13)| 00:00:24 | | |
|* 8 | HASH JOIN RIGHT OUTER | | 12519 | 2322K| 8082 (13)| 00:00:24 | | |
|* 9 | TABLE ACCESS FULL | BAP_NCTOBAPDEPT | 609 | 18270 | 4 (0)| 00:00:01 | | |
|* 10 | FILTER | | | | | | | |
|* 11 | HASH JOIN RIGHT OUTER | | 12519 | 1956K| 8077 (13)| 00:00:24 | | |
|* 12 | TABLE ACCESS FULL | BAP_CM_PSNDOC | 84 | 4284 | 33 (10)| 00:00:01 | | |
|* 13 | HASH JOIN RIGHT OUTER | | 629K| 65M| 8021 (12)| 00:00:24 | | |
|* 14 | TABLE ACCESS FULL | BAP_CM_ACCOUNT | 1 | 68 | 5627 (12)| 00:00:17 | | |
| 15 | PARTITION LIST SINGLE | | 629K| 24M| 2370 (13)| 00:00:07 | KEY | KEY |
|* 16 | TABLE ACCESS FULL | T_PM_ACCT_DTL | 629K| 24M| 2370 (13)| 00:00:07 | 352 | 352 |
| 17 | VIEW | | 93 | 3255 | 11396 (15)| 00:00:33 | | |
| 18 | HASH GROUP BY | | 93 | 5487 | 11396 (15)| 00:00:33 | | |
| 19 | PARTITION LIST INLIST | | 93 | 5487 | 11395 (15)| 00:00:33 |KEY(I) |KEY(I) |
|* 20 | TABLE ACCESS FULL | T_PM_ACCT_DTL_AF | 93 | 5487 | 11395 (15)| 00:00:33 |KEY(I) |KEY(I) |
---------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("T1"."ACCT_NO_PK"="T2"."ACCT_NO_PK")
3 - access("A"."MGR_CODE"="T2"."MGR_CODE")
5 - filter("A"."DEPT1_CODE"='18605' AND "A"."DEPT1_CODE"<>'999999999')
6 - access("A"."UNIT3_CODE"='18601' AND ("A"."MGR_CODE"='00798' OR "A"."MGR_CODE"='00817'))
8 - access("T2"."PK_DEPT"="T4"."PK_NCTOBAPDEPT"(+))
9 - filter("T4"."DEPTCODE"(+)<>'999999999')
10 - filter(NVL("T2"."CM_CODE",NVL("T3"."MGR_CODE",'xxxxxx'))='00798' OR
NVL("T2"."CM_CODE",NVL("T3"."MGR_CODE",'xxxxxx'))='00817')
11 - access("T1"."PK_CM_PSNDOC"="T2"."PK_CM_PSNDOC"(+))
12 - filter(DECODE(TO_CHAR("T2"."DR"(+)),'',0,"T2"."DR"(+))=0)
13 - access("T1"."ACCOUNT"(+)="T3"."ACCT_NO_PK")
14 - filter(DECODE("T1"."SEAL_FLAG"(+),'','N',"T1"."SEAL_FLAG"(+))='N' AND
REPLACE("T1"."EFFECT_DATE"(+),'-')<='20121217' AND DECODE(TO_CHAR("T1"."DR"(+)),'',0,"T1"."DR"(+))=0 AND
REPLACE(DECODE("T1"."SEAL_DATE"(+),'',"PKG_UF_BANK"."FN_GETNEXTDAY"('20121217','M'),"T1"."SEAL_DATE"(+)),'-')>
'20121217')
16 - filter("T3"."ACCT_FLAG"='DEPOSIT')
20 - filter("ACCT_FLAG"='DEPOSIT' AND SUBSTR("FLAG",1,1)='1' AND SUBSTR("FLAG",4,1)='1' AND
"T1"."DEPT1_CODE"<>'999999999' AND TO_NUMBER("T1"."CUR_CODE")=1) Statistics
----------------------------------------------------------
154 recursive calls
0 db block gets
193327 consistent gets
13545 physical reads
692 redo size
1064 bytes sent via SQL*Net to client
1649 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
2 rows processed