zoukankan      html  css  js  c++  java
  • 错误的选择了HASH JOIN!

    explain plan for select
    a.open_org as 机构号,
    a.org_name as 机构名,
    b.cur_cd as 币种,
    sum(b.acct_bal)/10000 as 余额,
    count(*) as 户数
    
    from
    ( select /*+ leading(y) use_nl(x y)*/  x.open_org , x.agmt_id , x.cust_no , y.org_name
    from dwf.F_AGT_SAVB_BASICINFO_H x , dwm.B_M_SYS_BRANCH y
    where x.start_dt<= to_date('2014-01-01', 'YYYY-MM-DD')
    and x.end_dt> to_date('2014-01-01', 'YYYY-MM-DD') 
    and x.acct_status in('0','S')
    and substr(x.cust_no,1,1) in('0','8','9','a')
    and x.open_org = y.org_id
    and y.parent_id='1015'
    )a,
    
    
    (
    select *
    from dwf.F_AGT_SAVB_ACCTINFO_H 
    where substr(subj_cd,1,3) in(201,202,205,251)
    and start_dt<= to_date('2014-01-01', 'YYYY-MM-DD')
    and end_dt> to_date('2014-01-01', 'YYYY-MM-DD')
    )b,
    
    
    (
    select * from dwf.F_PTY_TABLE
    where start_dt<= to_date('2014-01-01', 'YYYY-MM-DD')
    and end_dt> to_date('2014-01-01', 'YYYY-MM-DD')
    and corp_org='15601'
    and area_code <>'3310'
    )c
    
    where a.agmt_id=b.agmt_id
    and a.cust_no=c.pty_id
    group by a.open_org,a.org_name,b.cur_cd
    ;
    Plan hash value: 249788832
     
    ---------------------------------------------------------------------------------------------------------
    | Id  | Operation                      | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT               |                        |  1873 |   347K| 58231   (1)| 00:11:39 |
    |   1 |  HASH GROUP BY                 |                        |  1873 |   347K| 58231   (1)| 00:11:39 |
    |*  2 |   HASH JOIN                    |                        |  3056 |   567K| 58230   (1)| 00:11:39 |
    |   3 |    NESTED LOOPS                |                        |  2981 |   416K| 51040   (1)| 00:10:13 |
    |   4 |     NESTED LOOPS               |                        | 27214 |   416K| 51040   (1)| 00:10:13 |
    |*  5 |      HASH JOIN                 |                        |  2474 |   215K| 16383   (2)| 00:03:17 |
    |*  6 |       TABLE ACCESS FULL        | B_M_SYS_BRANCH         |     5 |   125 |     3   (0)| 00:00:01 |
    |*  7 |       TABLE ACCESS FULL        | F_AGT_SAVB_BASICINFO_H | 55736 |  3483K| 16379   (2)| 00:03:17 |
    |*  8 |      INDEX RANGE SCAN          | SYS_C00224616          |    11 |       |     3   (0)| 00:00:01 |
    |*  9 |     TABLE ACCESS BY INDEX ROWID| F_AGT_SAVB_ACCTINFO_H  |     1 |    54 |    14   (0)| 00:00:01 |
    |* 10 |    TABLE ACCESS FULL           | F_PTY_TABLE            |   103K|  4730K|  7189   (2)| 00:01:27 |
    ---------------------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       2 - access("X"."CUST_NO"="F_PTY_TABLE"."PTY_ID")
       5 - access("X"."OPEN_ORG"="Y"."ORG_ID")
       6 - filter("Y"."PARENT_ID"=1015)
       7 - filter(("X"."ACCT_STATUS"='0' OR "X"."ACCT_STATUS"='S') AND "X"."START_DT"<=TO_DATE(' 
                  2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND (SUBSTR("X"."CUST_NO",1,1)='0' OR 
                  SUBSTR("X"."CUST_NO",1,1)='8' OR SUBSTR("X"."CUST_NO",1,1)='9' OR SUBSTR("X"."CUST_NO",1,1)='a') 
                  AND "X"."END_DT">TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
       8 - access("X"."AGMT_ID"="F_AGT_SAVB_ACCTINFO_H"."AGMT_ID" AND "START_DT"<=TO_DATE(' 
                  2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
           filter("START_DT"<=TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
       9 - filter((TO_NUMBER(SUBSTR("SUBJ_CD",1,3))=201 OR TO_NUMBER(SUBSTR("SUBJ_CD",1,3))=202 OR 
                  TO_NUMBER(SUBSTR("SUBJ_CD",1,3))=205 OR TO_NUMBER(SUBSTR("SUBJ_CD",1,3))=251) AND 
                  "END_DT">TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
      10 - filter("CORP_ORG"='15601' AND "START_DT"<=TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd 
                  hh24:mi:ss') AND "END_DT">TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND 
                  "AREA_CODE"<>'3310')
    
    
    这里 select count(*) from B_M_SYS_BRANCH Y where ("Y"."PARENT_ID"=1015)
    select count(*) from B_M_SYS_BRANCH Y where ("Y"."PARENT_ID"=1015)
    --9
    
    这里ID=6 才返回9条记录,没必要走HASH JOIN,只需要B_M_SYS_BRANCH  作为驱动表去驱动F_AGT_SAVB_BASICINFO_H即可
    
    创建如下索引:
    create index F_AGT_SAVB_BASICINFO_H_IDX3  on F_AGT_SAVB_BASICINFO_H(OPEN_ORG,ACCT_STATUS,SUBSTR("CUST_NO",1,1))
    
    select
    a.open_org as 机构号,
    a.org_name as 机构名,
    b.cur_cd as 币种,
    sum(b.acct_bal)/10000 as 余额,
    count(*) as 户数
    
    from
    ( select /*+ leading(y) use_nl(x y)*/  x.open_org , x.agmt_id , x.cust_no , y.org_name
    from dwf.F_AGT_SAVB_BASICINFO_H x , dwm.B_M_SYS_BRANCH y
    where x.start_dt<= to_date('2014-01-01', 'YYYY-MM-DD')
    and x.end_dt> to_date('2014-01-01', 'YYYY-MM-DD') 
    and x.acct_status in('0','S')
    and substr(x.cust_no,1,1) in('0','8','9','a')
    and x.open_org = y.org_id
    and y.parent_id='1015'
    )a,
    
    
    (
    select *
    from dwf.F_AGT_SAVB_ACCTINFO_H 
    where substr(subj_cd,1,3) in(201,202,205,251)
    and start_dt<= to_date('2014-01-01', 'YYYY-MM-DD')
    and end_dt> to_date('2014-01-01', 'YYYY-MM-DD')
    )b,
    
    
    (
    select * from dwf.F_PTY_TABLE
    where start_dt<= to_date('2014-01-01', 'YYYY-MM-DD')
    and end_dt> to_date('2014-01-01', 'YYYY-MM-DD')
    and corp_org='15601'
    and area_code <>'3310'
    )c
    
    where a.agmt_id=b.agmt_id
    and a.cust_no=c.pty_id
    group by a.open_org,a.org_name,b.cur_cd
    ;
    
    
    Plan hash value: 1581029793
     
    -----------------------------------------------------------------------------------------------------------------
    | Id  | Operation                         | Name                        | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                  |                             |   644 |   121K| 28461   (1)| 00:05:42 |
    |   1 |  HASH GROUP BY                    |                             |   644 |   121K| 28461   (1)| 00:05:42 |
    |   2 |   NESTED LOOPS                    |                             |   644 |   121K| 28460   (1)| 00:05:42 |
    |   3 |    NESTED LOOPS                   |                             |  5874 |   121K| 28460   (1)| 00:05:42 |
    |   4 |     NESTED LOOPS                  |                             |   534 | 74226 | 20980   (1)| 00:04:12 |
    |   5 |      NESTED LOOPS                 |                             |   521 | 47932 | 19416   (1)| 00:03:53 |
    |*  6 |       TABLE ACCESS FULL           | B_M_SYS_BRANCH              |     5 |   125 |     3   (0)| 00:00:01 |
    |   7 |       INLIST ITERATOR             |                             |       |       |            |          |
    |*  8 |        TABLE ACCESS BY INDEX ROWID| F_AGT_SAVB_BASICINFO_H      |   110 |  7370 |  5495   (1)| 00:01:06 |
    |*  9 |         INDEX RANGE SCAN          | F_AGT_SAVB_BASICINFO_H_IDX3 | 13903 |       |    49   (0)| 00:00:01 |
    |* 10 |      TABLE ACCESS BY INDEX ROWID  | F_PTY_TABLE                 |     1 |    47 |     3   (0)| 00:00:01 |
    |* 11 |       INDEX RANGE SCAN            | SYS_C00224099               |     1 |       |     2   (0)| 00:00:01 |
    |* 12 |     INDEX RANGE SCAN              | SYS_C00224616               |    11 |       |     3   (0)| 00:00:01 |
    |* 13 |    TABLE ACCESS BY INDEX ROWID    | F_AGT_SAVB_ACCTINFO_H       |     1 |    54 |    14   (0)| 00:00:01 |
    -----------------------------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       6 - filter("Y"."PARENT_ID"=1015)
       8 - filter("X"."START_DT"<=TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND 
                  "X"."END_DT">TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
       9 - access("X"."OPEN_ORG"="Y"."ORG_ID" AND ("X"."ACCT_STATUS"='0' OR "X"."ACCT_STATUS"='S') AND 
                  (SUBSTR("CUST_NO",1,1)='0' OR SUBSTR("CUST_NO",1,1)='8' OR SUBSTR("CUST_NO",1,1)='9' OR 
                  SUBSTR("CUST_NO",1,1)='a'))
      10 - filter("END_DT">TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "AREA_CODE"<>'3310')
      11 - access("X"."CUST_NO"="F_PTY_TABLE"."PTY_ID" AND "CORP_ORG"='15601' AND "START_DT"<=TO_DATE(' 
                  2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
           filter("CORP_ORG"='15601' AND "START_DT"<=TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd 
                  hh24:mi:ss') AND SUBSTR("CUST_NO",1,1)=SUBSTR("F_PTY_TABLE"."PTY_ID",1,1))
      12 - access("X"."AGMT_ID"="F_AGT_SAVB_ACCTINFO_H"."AGMT_ID" AND "START_DT"<=TO_DATE(' 2014-01-01 
                  00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
           filter("START_DT"<=TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
      13 - filter((TO_NUMBER(SUBSTR("SUBJ_CD",1,3))=201 OR TO_NUMBER(SUBSTR("SUBJ_CD",1,3))=202 OR 
                  TO_NUMBER(SUBSTR("SUBJ_CD",1,3))=205 OR TO_NUMBER(SUBSTR("SUBJ_CD",1,3))=251) AND "END_DT">TO_DATE(' 
                  2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
    

  • 相关阅读:
    显示文件本地文件夹
    Select Dependencies选择依赖项
    搜索小技巧
    783. Minimum Distance Between BST Nodes BST节点之间的最小距离
    5. Longest Palindromic Substring 最长的回文子串
    12. Integer to Roman 整数转罗马数字
    3. Longest Substring Without Repeating Characters 最长的子串不重复字符
    539. Minimum Time Difference 最小时差
    43. Multiply Strings 字符串相乘
    445. Add Two Numbers II 两个数字相加2
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13352155.html
Copyright © 2011-2022 走看看