解决方案 »

  1.   

    我在EXT_LCJK_LCHJMX  B 表建立分别建立XDRQ,XDSJ,LCID三个字段的索引,还分别建立EXT_LCJK_LC  A表CJDW,CJRQ的索引但是查询还是很慢!求求大神帮助优化一下
      

  2.   

    select * from table(dbms_xplan.display_cursor('sql_id',null,'advanced'));把全部的执行计划贴出来 
      

  3.   

    语句方面优化空间还很大
    1、最外层的GROUP BY CJDW, M.JGMC去掉
    外层查询直接SELECT M.JGMC AS CJDW,T.LCZS,T.LCWCZS,T.LCWWCZS,T.LCCSWCZS,T.LCWCSWCZS
    子查询中已经做完汇总了,外层再汇总就没啥必要了
    2、 AND TO_DATE(LPAD(B.DDRQ, 8, '0') || LPAD(B.DDSJ, 6, '0'),
                           'YYYYMMDDHH24MISS') =
                   (SELECT MAX(TO_DATE(LPAD(DDRQ, 8, '0') || LPAD(DDSJ, 6, '0'),
                                       'YYYYMMDDHH24MISS'))
                      FROM EXT_LCJK_LCHJMX
                     WHERE LCID = B.LCID)
    这个条件可以考虑使用分析函数max()keep(dense_rank last order by)的方式实现,比表自身关联要快
    3、通过cjdw获取JGMC这个没啥必要,保留原来的cjdw
    SELECT (select JGMC FROM EXT_YX_SYS_JGXX WHERE JGBM = A.CJDW) AS CJDW,
    改为select A.CJDW
    外层关联条件改为T.CJDW(+) = M.JGBM
      

  4.   


    SELECT STATEMENT, GOAL = ALL_ROWS 21419 1 111 2280824746 0 0 21153 SELECT STATEMENT ALL_ROWS 1514 21419 YPGJ_USER 258 2014-11-20 16:02:57
     HASH GROUP BY 21419 1 111 2280824746 1 1 21153 HASH GROUP BY 0 1514 1 (#keys=2) "CJDW"[VARCHAR2,40], "JGMC"[VARCHAR2,40], SUM("T"."LCWCSWCZS")[22], SUM("T"."LCCSWCZS")[22], SUM("T"."LCWWCZS")[22], SUM("T"."LCWCZS")[22], SUM("T"."LCZS")[22] SEL$66276EDA YPGJ_USER 258 2014-11-20 16:02:57
      HASH JOIN OUTER 21418 1 111 "T"."CJDW"(+)="JGMC" 2272257882 2 2 21153 HASH JOIN OUTER 1 1514 1 (#keys=1) "JGMC"[VARCHAR2,40], "T"."CJDW"[VARCHAR2,40], "T"."LCWCSWCZS"[NUMBER,22], "T"."LCZS"[NUMBER,22], "T"."LCWCZS"[NUMBER,22], "T"."LCWWCZS"[NUMBER,22], "T"."LCCSWCZS"[NUMBER,22] YPGJ_USER 258 2014-11-20 16:02:57
       TABLE ACCESS BY INDEX ROWID YPGJ_USER EXT_YX_SYS_JGXX 2 1 24 15023 3 3 2 EXT_YX_SYS_JGXX@SEL$5 7 TABLE TABLE ACCESS ANALYZED BY INDEX ROWID 2 1514 1 "JGMC"[VARCHAR2,40] SEL$66276EDA YPGJ_USER 1 2014-11-20 16:02:57
        INDEX RANGE SCAN YPGJ_USER PK_EXT_YX_SYS_JGXX 1 1 "JGBM" LIKE '17%' 7521 4 "JGBM" LIKE '17%' 4 1 EXT_YX_SYS_JGXX@SEL$5 INDEX (UNIQUE) INDEX ANALYZED RANGE SCAN 3 1514 1 "EXT_YX_SYS_JGXX".ROWID[ROWID,10] SEL$66276EDA 1 YPGJ_USER 1 2014-11-20 16:02:57
       VIEW YPGJ_USER 21416 148 12876 2267944477 3 5 21151 T@SEL$1 1 VIEW 2 1514 2 "CJDW"[VARCHAR2,40], "T"."LCZS"[NUMBER,22], "T"."LCWCZS"[NUMBER,22], "T"."LCWWCZS"[NUMBER,22], "T"."LCCSWCZS"[NUMBER,22], "T"."LCWCSWCZS"[NUMBER,22] SEL$833EAD59 YPGJ_USER 257 2014-11-20 16:02:57
        HASH GROUP BY 21416 148 21164 2267944477 4 6 21151 HASH GROUP BY 5 1514 1 (#keys=1) "A"."CJDW"[VARCHAR2,40], COUNT(CASE  WHEN ("A"."LCZT"=2 AND TO_DATE(LPAD(TO_CHAR("B"."XDRQ"),8,'0')||LPAD(TO_CHAR("B"."XDSJ"),6,'0'),'YYYYMMDDHH24MISS')<SYSDATE@!) THEN 1 ELSE NULL END )[22], COUNT(CASE  WHEN ("A"."LCZT"=2 AND TO_DATE(LPAD(TO_CHAR("B"."XDRQ"),8,'0')||LPAD(TO_CHAR("B"."XDSJ"),6,'0'),'YYYYMMDDHH24MISS')>SYSDATE@!) THEN 1 ELSE NULL END )[22], COUNT(CASE "A"."LCZT" WHEN 0 THEN 1 ELSE NULL END )[22], COUNT(CASE "A"."LCZT" WHEN 2 THEN 1 ELSE NULL END )[22], COUNT(*)[22] SEL$833EAD59 YPGJ_USER 257 2014-11-20 16:02:57
         HASH JOIN 21415 148 21164 "VW_COL_1"=TO_DATE(LPAD(TO_CHAR("B"."DDRQ"),8,'0')||LPAD(TO_CHAR("B"."DDSJ"),6,'0'),'YYYYMMDDHH24MISS') AND "ITEM_0"="B"."LCID" 2259329539 5 7 21151 HASH JOIN 6 1514 1 (#keys=2) "A"."CJDW"[VARCHAR2,40], "A"."LCZT"[NUMBER,22], "B"."XDSJ"[NUMBER,22], "B"."XDRQ"[NUMBER,22] YPGJ_USER 257 2014-11-20 16:02:57
          TABLE ACCESS BY INDEX ROWID YPGJ_USER EXT_LCJK_LCHJMX 4 6 330 36686 6 8 4 B@SEL$2 4 TABLE TABLE ACCESS ANALYZED BY INDEX ROWID 7 1514 1 "B"."LCID"[VARCHAR2,40], "B"."DDRQ"[NUMBER,22], "B"."DDSJ"[NUMBER,22], "B"."XDRQ"[NUMBER,22], "B"."XDSJ"[NUMBER,22] SEL$833EAD59 YPGJ_USER 1 2014-11-20 16:02:57
           NESTED LOOPS 10005 14799 1494699 231578456 7 9 9978 NESTED LOOPS 8 1514 1 (#keys=0) "A"."CJDW"[VARCHAR2,40], "A"."LCZT"[NUMBER,22], "B".ROWID[ROWID,10], "B"."LCID"[VARCHAR2,40] YPGJ_USER 121 2014-11-20 16:02:57
            PARTITION LIST ALL 1588 2469 113574 155824986 8 10 1570 PARTITION LIST ALL 9 10 1 5 1514 1 "A"."LCID"[VARCHAR2,40], "A"."CJDW"[VARCHAR2,40], "A"."LCZT"[NUMBER,22] YPGJ_USER 20 2014-11-20 16:02:57
             TABLE ACCESS FULL YPGJ_USER EXT_LCJK_LC 1588 2469 113574 155824986 9 "A"."CJRQ">=20141101 AND "A"."CJDW" LIKE '17%' AND "A"."CJRQ"<=20141131 11 1570 A@SEL$2 3 TABLE TABLE ACCESS ANALYZED FULL 10 10 1 5 1514 1 "A"."LCID"[VARCHAR2,40], "A"."CJDW"[VARCHAR2,40], "A"."LCZT"[NUMBER,22] SEL$833EAD59 YPGJ_USER 20 2014-11-20 16:02:57
            INDEX RANGE SCAN YPGJ_USER LCID_INDEX 2 6 "A"."LCID"="B"."LCID" 16493 8 12 2 B@SEL$2 INDEX INDEX ANALYZED RANGE SCAN 9 1514 2 "B".ROWID[ROWID,10], "B"."LCID"[VARCHAR2,40] SEL$833EAD59 1 YPGJ_USER 1 2014-11-20 16:02:57
          VIEW SYS VW_SQ_1 11406 273907 11504094 1993857100 6 13 11173 VW_SQ_1@SEL$93120962 8 VIEW VIEW 7 1514 2 "VW_COL_1"[DATE,7], "ITEM_0"[VARCHAR2,40] SEL$8F9407EC YPGJ_USER 137 2014-11-20 16:02:57
           HASH GROUP BY 11406 273907 12051908 1993857100 7 14 11173 HASH GROUP BY 13 1514 1 (#keys=1) "LCID"[VARCHAR2,40], MAX(TO_DATE(LPAD(TO_CHAR("DDRQ"),8,'0')||LPAD(TO_CHAR("DDSJ"),6,'0'),'YYYYMMDDHH24MISS'))[7] SEL$8F9407EC YPGJ_USER 92783000 137 2014-11-20 16:02:57
            INDEX FAST FULL SCAN YPGJ_USER LCID_DDRQ_DDSJ 2802 1642088 72251872 287319970 8 15 2768 EXT_LCJK_LCHJMX@SEL$4 INDEX INDEX ANALYZED FAST FULL SCAN 14 1514 1 "LCID"[VARCHAR2,40], "DDRQ"[NUMBER,22], "DDSJ"[NUMBER,22] SEL$8F9407EC YPGJ_USER 34 2014-11-20 16:02:57
    这是从plsql粘出来的全部执行计划
      

  5.   

     
    谢谢版主的回答,我那最外层的汇总确实没必要,已经去掉了,第三个通过cjdw获取JGMC这个没啥必要,因为我要拿创建单位(cjdw是一个编码)去EXT_YX_SYS_JGXX表中找到对应的机构名称(JGMC)
      

  6.   

    EXT_YX_SYS_JGXX 中jgbm和jgmc是一一对应的吧,使用jgmc关联和使用jgbm关联效果是一样的
    名称在外层做外连接的时候使用M.JGMC就直接取出来了,外连接之前使用jgbm与cjdw关联就可以了