利用no_merge优化

来源:互联网 发布:淘宝怎么设置定时开售 编辑:程序博客网 时间:2024/06/10 02:30
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 processedselect 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 


 

原创粉丝点击