TBL入出库履历 有以下字段
日期,商品CD,仓库,实际在库数,入库予定,入库确定,出庫予定,出庫確定
语句如下:
Select E.日期,E.商品CD,E.仓库,E.实际在库数,E.调整数,E.入库予定,E.入库确定,E.出庫予定,E.出庫確定
from  
(SELECT A.日期  
      ,A.商品CD   
      ,A.仓库  
      ,(SELECT NVL(SUM(B.实际在库数),0)   
          FROM 入出库履历 B 
         WHERE 
           B.商品CD = A.商品CD             
           AND B.仓库 = A.仓库  
           AND B.日期=A.日期)  实际在库数  
      ,(SELECT NVL(SUM(C.入库予定),0)+NVL(SUM(C.入库确定),0)-NVL(SUM(C.出庫予定),0)-NVL(SUM(C.出庫確定),0)
         FROM 入出库履历 C  
         WHERE NOT EXISTS 
           (SELECT 1 FROM 入出库履历 WHERE 商品CD=C.商品CD  AND  
            仓库=C.仓库  AND 日期>=C.日期 AND 日期<A.日期 AND 实际在库数<>0)
           AND C.日期<=A.日期 
           AND C.商品CD = A.商品CD 
           AND C.仓库 = A.仓库) 调整数      
      ,SUM(A.入库予定) 入库予定  
      ,SUM(A.入库确定) 入库确定  
      ,SUM(A.出庫予定) 出庫予定
      ,SUM(A.出庫確定) 出庫確定
   FROM 入出库履历 A  
 GROUP BY A.日期  
         ,A.商品CD  
         ,A.仓库,) E
order by E.商品CD,E.仓库
调整数统计的是最近的一次有实在库的日期到当前日期之间的记录
现在表里面有4万多条数据,执行需要10分钟左右,有什么办法可以提高效率啊

解决方案 »

  1.   

    除了加索引  如果可以 把嵌套表 替换成 join 连接
      

  2.   

    4万多条,10分钟?虽然sum多,但不至于这么慢啊。。我原来做进销存,用postgres查10万记录也没用这么久你可以分段执行,看哪段慢,调哪段。
      

  3.   

    试试这个,我想应该差写个不多吧,祝好运:
    with t1 as(
        SELECT A.日期  
              ,A.商品CD   
              ,A.仓库  
              ,SUM(NVL(A.实际在库数,0)) 实际在库数
              ,SUM(NVL(A.入库予定  ,0)) 入库予定  
              ,SUM(NVL(A.入库确定  ,0)) 入库确定  
              ,SUM(NVL(A.出庫予定  ,0)) 出庫予定
              ,SUM(NVL(A.出庫確定  ,0)) 出庫確定
           FROM 入出库履历 A
         GROUP BY A.日期
                   ,A.商品CD
                 ,A.仓库
        )
    SELECT 
           日期,
           商品CD,
           实际在库数,
           sum( 入库予定+入库确定-出庫予定-出庫確定 )over(ORDER BY 商品CD,仓库 rows between 1 preceding and current row) 调整数,
           入库予定,
           入库确定,
           出庫予定,
           出庫確定
      FROM t1
     WHERE 实际在库数<>0
    UNION
    SELECT 
           日期,
           商品CD,
           实际在库数,
           0 调整数,
           入库予定,
           入库确定,
           出庫予定,
           出庫確定
      FROM t1
     WHERE 实际在库数=0;
      

  4.   

    没读懂LZ的SQL,自己重新写了个SELECT 
     A.日期  
    ,A.商品CD
    ,A.仓库  
    ,NVL(SUM(A.实际在库数),0) 实际在库数  
    ,NVL(SUM(A.入库予定),0)+NVL(SUM(A.入库确定),0)-NVL(SUM(A.出庫予定),0)-NVL(SUM(A.出庫確定),0) 调整数 
    ,SUM(A.入库予定) 入库予定  
    ,SUM(A.入库确定) 入库确定  
    ,SUM(A.出庫予定) 出庫予定
    ,SUM(A.出庫確定) 出庫確定
    FROM 入出库履历 A  
    GROUP BY A.日期 ,A.商品CD ,A.仓库 order by A.商品CD,A.仓库
      

  5.   

    1. 在商品CD,仓库建立索引,是orber by 和sum计算更快。
    2.  (SELECT 1 FROM 入出库履历 WHERE 商品CD=C.商品CD  AND  
                仓库=C.仓库  AND 日期>=C.日期 AND 日期<A.日期 AND 实际在库数<>0)
               AND C.日期<=A.日期 
               AND C.商品CD = A.商品CD 
               AND C.仓库 = A.仓库)
    修改为
     (SELECT 1 FROM 入出库履历 WHERE 商品CD=C.商品CD  AND  
                仓库=C.仓库  AND 日期 between C.日期 AND A.日期 AND 实际在库数 != 0)
               AND C.日期<=A.日期 
               AND C.商品CD = A.商品CD 
               AND C.仓库 = A.仓库)
      

  6.   

    优化最先做的是 重新设计SQL语句,不是精通sql的人常常是根据功能拼出来的SQL的,往往SQL写很差。
    SQL写好了,然后再考虑oracle SQL执行计划的优化。