首页 > 数据库技术 > 详细

MSSQL效率优化随记

时间:2014-02-28 07:56:14      阅读:568      评论:0      收藏:0      [点我收藏+]

1.尽量不要在where中进行计算,尤其是需要遍历的情况
原来代码,执行大约40秒

bubuko.com,布布扣
INSERT INTO @TransferCode ( PROXY_NO, TING_NO, WTotal, BTotal )
            SELECT    H.PROXY_NO, H.TING_NO, 
                    SUM(CASE WHEN H.CARDTYPE=W THEN CASE WHEN (B.DDATE=‘‘ AND B.DTIME=‘‘) THEN 0 WHEN B.BCHIPEX=10 THEN -B.BCHIP ELSE B.BCHIP END ELSE 0 END),
                    SUM(CASE WHEN H.CARDTYPE=B THEN CASE WHEN (B.DDATE=‘‘ AND B.DTIME=‘‘) THEN 0 WHEN B.BCHIPEX=10 THEN -B.BCHIP ELSE B.BCHIP END ELSE 0 END)
            FROM    dbo.CM_ROCARDB AS B
            LEFT JOIN dbo.CM_ROCARDH AS H ON B.BARCODE = H.BARCODE
            LEFT JOIN dbo.CM_PROXY AS P ON P.PROXY_NO=H.PROXY_NO
            WHERE    (@TingNo=‘‘ OR H.TING_NO=@TingNo)
                AND (@ProxyNo=‘‘  OR (H.PROXY_NO LIKE @ProxyNo+% OR P.PROXY_NAME LIKE @ProxyNo+%))
                AND (@HuKou=‘‘ OR (EXISTS(SELECT 1 FROM dbo.CM_PROXY WHERE HUKOU_NO=@HuKou AND PROXY_NO=H.PROXY_NO)))
                AND    dbo.GetTransCodeEndYM(B.BARCODE, B.BodyNo)=@YearMonth
            GROUP BY H.PROXY_NO, H.TING_NO
            ORDER BY H.PROXY_NO, H.TING_NO
bubuko.com,布布扣

主要是费时的在dbo.GetTransCodeEndYM(B.BARCODE, B.BodyNo)=@YearMonth函数这段,其中B.BARCODE, B.BodyNo为
Primary Key
优化的代码,执行大约1秒

bubuko.com,布布扣
INSERT INTO @TransferCode ( PROXY_NO, TING_NO, WTotal, BTotal )
            SELECT    PROXY_NO, TING_NO, 
                    SUM(CASE WHEN CARDTYPE=W THEN CASE WHEN (DDATE=‘‘ AND DTIME=‘‘) THEN 0 WHEN BCHIPEX=10 THEN -BCHIP ELSE BCHIP END ELSE 0 END),
                    SUM(CASE WHEN CARDTYPE=B THEN CASE WHEN (DDATE=‘‘ AND DTIME=‘‘) THEN 0 WHEN BCHIPEX=10 THEN -BCHIP ELSE BCHIP END ELSE 0 END)
            FROM (
            SELECT    H.PROXY_NO, H.TING_NO, H.CARDTYPE, B.DDATE, B.DTIME, B.BCHIPEX, B.BCHIP,
                    dbo.GetTransCodeEndYM(B.BARCODE, B.BodyNo) AS YearMonth
            FROM    dbo.CM_ROCARDB AS B
            LEFT JOIN dbo.CM_ROCARDH AS H ON B.BARCODE = H.BARCODE
            LEFT JOIN dbo.CM_PROXY AS P ON P.PROXY_NO=H.PROXY_NO
            WHERE    (@TingNo=‘‘ OR H.TING_NO=@TingNo)
                AND (@ProxyNo=‘‘  OR (H.PROXY_NO LIKE @ProxyNo+% OR P.PROXY_NAME LIKE @ProxyNo+%))
                AND (@HuKou=‘‘ OR (EXISTS(SELECT 1 FROM dbo.CM_PROXY WHERE HUKOU_NO=@HuKou AND PROXY_NO=H.PROXY_NO)))
            ) AS A
            WHERE YearMonth=@YearMonth    
            GROUP BY PROXY_NO, TING_NO
            ORDER BY PROXY_NO, TING_NO
bubuko.com,布布扣

将步骤调整为先执行过滤数据,函数计算放在select中,这样将过滤数据后再进行计算,然后再通过过滤年月查询
注:测试时只查询一个proxyno,为空时估计更明显



MSSQL效率优化随记,布布扣,bubuko.com

MSSQL效率优化随记

原文:http://www.cnblogs.com/ywkpl/p/3571357.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!