解决方案 »

  1.   

         Qcountb(gb91,gb51)建上索引
          Qcountsum(sga51,sga91,SID)建上索引语句本身没什么可优化的,在以上列建上索引再试试性能
      

  2.   

    执行计划发上来看看。 Ctrl+ L;该做的索引是否都做全了。 基础表的行数大概是? SELECT sga51 日期 ,
            SUM(sga91) 生产数量 ,
            SUM(b.gb92) 厂内不良数量 ,
            SUM(b.gb94) 厂外不良数量 ,
            CONVERT(DECIMAL(18, 4), SUM(b.gb92) * 1.00 / ( SUM(sga91) * 1.00 )
            * 100) 厂内不良率百分比 ,
            CONVERT(DECIMAL(18, 4), SUM(b.gb94) * 1.00 / ( SUM(sga91) * 1.00 )
            * 100) 厂外不良率百分比 ,
            CONVERT(DECIMAL(18, 4), SUM(b.gb92 + b.gb94) * 1.00 / ( SUM(sga91)* 1.00 ) * 100) 总不良率
     FROM   Qcountsum a
            LEFT JOIN ( SELECT  gb91 ,
                                SUM(gb92) gb92 ,
                                SUM(gb94) gb94
                        FROM    Qcountb
                        WHERE   gb51 BETWEEN '2014-11-01' AND '2014-11-20'
                        GROUP BY gb91
                      ) b ON a.SID = b.gb91
     WHERE  a.sga91 > 0
            AND a.sga51 BETWEEN '2014-11-01' AND '2014-11-20'
     GROUP BY sga51
     ORDER BY sga51
      

  3.   

    上索引不太明白, 建索引倒是明白的.  什么是上索引呢
    看你的语言理解能力也有问题
    在数据库里执行一下,再测执行时间
    CREATE INDEX IX_Qcountb_gb91_gb51 ON Qcountb(gb91,gb51);
    CREATE INDEX IX_Qcountsum_sga51_sga91_SID ON Qcountsum(sga51,sga91,SID);
      

  4.   

    上索引不太明白, 建索引倒是明白的.  什么是上索引呢
    看你的语言理解能力也有问题
    在数据库里执行一下,再测执行时间
    CREATE INDEX IX_Qcountb_gb91_gb51 ON Qcountb(gb91,gb51);
    CREATE INDEX IX_Qcountsum_sga51_sga91_SID ON Qcountsum(sga51,sga91,SID);
    高人,索引果然有用,拜谢.
      

  5.   

    既然最终结果是按日统计的,而且 Qcountb.gb51 和 Qcountsum.sga51 都是日期,为什么不按日期分组统计后关联?
    难道a.SID=b.gb91关联记录的日期会不一样?
    下面的查询要在 Qcountb.gb51 和 Qcountsum.sga51 分别建索引。
        SELECT a.sga51 日期,
               a.sga91 生产数量,
               b.gb92 厂内不良数量,
               b.gb94 厂外不良数量,
               CONVERT(DECIMAL(18,4),b.gb92 * 1.00 / (a.sga91 * 1.00) * 100) 厂内不良率百分比,
               CONVERT(DECIMAL(18,4),b.gb94 * 1.00 / (a.sga91 * 1.00) * 100) 厂外不良率百分比,
               CONVERT(DECIMAL(18,4),b.gb92 + b.gb94 * 1.00 / (a.sga91 * 1.00) * 100) 总不良率
          FROM (  SELECT sga51,
                         SUM(sga91) sga91
                    FROM qcountsum
                   WHERE sga91 > 0
                     AND sga51 BETWEEN '2014-11-01' AND '2014-11-20'
                GROUP BY sga51
               ) a
     LEFT JOIN (  SELECT gb51,
                         SUM(gb92) gb92,
                         SUM(gb94) gb94
                    FROM qcountb
                   WHERE gb51 BETWEEN '2014-11-01' AND '2014-11-20'
                GROUP BY gb51
               ) b
            ON a.sga51 = b.gb51
      ORDER BY a.sga51