zoukankan      html  css  js  c++  java
  • 利用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
    
    
    
    
    
    
     
    


     

  • 相关阅读:
    判断是否启用缓存,启用后直读缓存信息
    XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式
    bool型变量下标的时候javascript是不能允许的
    SQL服务器在执行这条语句时会先进行运算然后执行
    secureCRT常见命令
    Linux常用命令之链接命令和权限管理命令
    Linux常用命令之文件和目录处理命令
    linux:终端常用命令 + vi命令修改文件及保存 方法
    linux读书笔记1
    Linux各目录及每个目录的详细介绍
  • 原文地址:https://www.cnblogs.com/zhaoyangjian724/p/3798109.html
Copyright © 2011-2022 走看看