当前位置: 代码迷 >> Oracle开发 >> orace SQL 建立索引优化有关问题
  详细解决方案

orace SQL 建立索引优化有关问题

热度:109   发布时间:2016-04-24 06:33:47.0
orace SQL 建立索引优化问题
SELECT M.JGMC AS CJDW,
       SUM(T.LCZS) AS LCZS,
       SUM(T.LCWCZS) AS LCWCZS,
       SUM(T.LCWWCZS) AS LCWWCZS,
       SUM(T.LCCSWCZS) AS LCCSWCZS,
       SUM(T.LCWCSWCZS) AS LCWCSWCZS
  FROM (SELECT (select JGMC FROM EXT_YX_SYS_JGXX WHERE JGBM = A.CJDW) AS CJDW,
               COUNT(*) AS LCZS,
               COUNT(CASE
                       WHEN A.LCZT = 2 THEN
                        1
                       ELSE
                        NULL
                     END) LCWCZS,
               COUNT(CASE
                       WHEN A.LCZT = 0 THEN
                        1
                       ELSE
                        NULL
                     END) LCWWCZS,
               COUNT(CASE
                       WHEN A.LCZT = 2 AND
                            TO_DATE(LPAD(B.XDRQ, 8, '0') || LPAD(B.XDSJ, 6, '0'),
                                    'YYYYMMDDHH24MISS') > SYSDATE THEN
                        1
                       ELSE
                        NULL
                     END) LCCSWCZS,
               COUNT(CASE
                       WHEN A.LCZT = 2 AND
                            TO_DATE(LPAD(B.XDRQ, 8, '0') || LPAD(B.XDSJ, 6, '0'),
                                    'YYYYMMDDHH24MISS') < SYSDATE THEN
                        1
                       ELSE
                        NULL
                     END) LCWCSWCZS
          FROM EXT_LCJK_LC A, EXT_LCJK_LCHJMX B
         WHERE A.LCID = B.LCID
           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)
           AND A.CJDW LIKE '17%'
           AND A.CJRQ >= '20141101'
           AND A.CJRQ <= '20141131'
         GROUP BY A.CJDW) T,
       (SELECT JGMC FROM EXT_YX_SYS_JGXX WHERE JGBM LIKE '17%') M
 WHERE T.CJDW(+) = M.JGMC
 GROUP BY CJDW, M.JGMC


  想问大神们这个怎么优化?
------解决思路----------------------
select * from table(dbms_xplan.display_cursor('sql_id',null,'advanced'));把全部的执行计划贴出来 
------解决思路----------------------
语句方面优化空间还很大
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
------解决思路----------------------
EXT_YX_SYS_JGXX 中jgbm和jgmc是一一对应的吧,使用jgmc关联和使用jgbm关联效果是一样的
名称在外层做外连接的时候使用M.JGMC就直接取出来了,外连接之前使用jgbm与cjdw关联就可以了