瞄了一下,多次访问ic_xfhzk这个表,看看能否改写一下减少访问次数,可以考虑先用临时表之类的存放这个表并且把相同筛选条件的先过滤掉,减少后续操作的数据量

解决方案 »

  1.   

    我帮你移到Oracle吧,这是SQL Server
      

  2.   

    b表 查询语句有两层group 可以考虑简化成一层
      

  3.   

    b表语句改为这样
    (SELECT CAST(to_date('2014-1-31','yyyy-mm-dd') AS DATE) AS datee,dwbh,xlbh,SUM(ic) AS icm,SUM(tb) AS tbm FROM (SELECT dwbh,xlbh,xfjee AS IC,nvl(0,0) AS TB FROM ic_xfhzk  WHERE  datee BETWEEN to_date('2014-1-1','yyyy-mm-dd') AND to_date('2014-1-31','yyyy-mm-dd') AND dwbh IN('0100','0200','0300')
              UNION ALL
              SELECT dwbh,xlbh,nvl(0,0) AS IC,xfjee AS TB FROM ic_xjhzk  WHERE  datee BETWEEN to_date('2014-1-1','yyyy-mm-dd') AND to_date('2014-1-31','yyyy-mm-dd') AND dwbh IN('0100','0200','0300')
    ) GROUP BY dwbh,xlbh) 
      

  4.   

    a表的datee,在结果中没有体现,可以只按dwbh,xlbh两个分组即可
     (SELECT dwbh,xlbh,nvl(SUM(CASE WHEN sjlx='01'THEN xfjee END),0) AS A,nvl(SUM(CASE WHEN sjlx='A4'THEN xfjee END),0) AS C,nvl(SUM(CASE WHEN sjlx='B9'THEN xfjee END),0) AS I,nvl(SUM(CASE WHEN sjlx='A5'THEN xfjee END),0) AS D,nvl(SUM(CASE WHEN sjlx='30'THEN xfjee END),0) AS T,nvl(SUM(CASE WHEN sjlx='80'THEN xfjee END),0) AS TB
            FROM 
            (SELECT dwbh,xlbh,sjlx,xfjee FROM ic_xfhzk WHERE datee = to_date('2014-1-31','yyyy-mm-dd') AND dwbh IN('0100','0200','0300')
            UNION ALL
            SELECT dwbh,xlbh,sjlx,xfjee FROM ic_xjhzk WHERE datee = to_date('2014-1-31','yyyy-mm-dd') AND dwbh IN('0100','0200','0300')) 
            GROUP BY dwbh,xlbh)
      

  5.   

    感谢 涅磐重生NPCS  !这个语句放在测试服务器上跑很快(测试服务器是之前用正式服务器备份出来的数据恢复建立,索引一都一样),正式服务器上跑慢好多,郁闷,,是索引需要重建还是!!哪位给点提示!!