TSQL1:觀察到延伸資料表[W]內已經有下 WHERE 條件[18、19],但延伸資料表[W]又下了一次相同效果的 WHERE 語法[32、33]
-- TSQL1 SELECT w.order_no , w.pid, W.DDATE, sum(w.qty) AS qty, s.modelcode, s.odno, s.opt_no FROM ( SELECT ORDER_NO, PID, QTY, (right(replicate('0', 3) + cast(year(date)-1911 AS VARCHAR),3)+RIGHT(REPLICATE('0',2)+CAST(MONTH(DATE) AS VARCHAR),2)) AS DDATE, WK_ID FROM pmwkok WHERE (date BETWEEN '20121101' AND '20131130' ) AND WK_ID= 'D1021' ) as w join pmsetorder as s on w.order_no = s.order_no JOIN ( SELECT K.order_no, min(K.PID) AS PID FROM PMWKOK AS K WHERE (K.date BETWEEN '20121101' AND '20131130' ) AND K.WK_ID = 'D1021' GROUP BY K.ORDER_NO ) AS V ON V.ORDER_NO = W.ORDER_NO AND V.PID=W.PID WHERE w.Ddate BETWEEN '10111' AND '10211' AND w.wk_id= 'D1021' GROUP BY W.DDATE,W.order_no,W.pid,s.modelcode,s.odno,s.opt_no
TSQL2:可以觀察到延伸資料表[CS]內 UNION ALL 中的兩個子集合已經有[23、24]和[43、44]WHERE 條件,但延伸資料表[CS]又下相同 WHERE 條件[48]
-- TSQL2 SELECT CS.[MONTH], SUM(CS.HASPAID) AS HASPAID, SUM(cs.exmoney) as exmoney, SUM(CS.HASPAID)- SUM(cs.exmoney) as [normal], case when SUM(CS.HASPAID)=0 then 0 ELSE ROUND(SUM(cs.exmoney)/SUM(CS.HASPAID)*100,2) end [rate] FROM ( SELECT MS.[MONTH], CASE WHEN E.WK_ID='D2031'OR E.WK_ID='D2032' THEN 'D203' ELSE E.WK_ID END WK_ID, sum(ROUND(MS.Salary + MS.YearMoney + MS.PostMoney + MS.TechMoney + MS.ETCMoney + MS.P_Bonus + MS.O_Salary + MS.O_Fee + MS.WorkWayFee + MS.Wextra + MS.Auxeat, 0)) AS HASPAID, SUM( MS.O_Salary + MS.O_Fee) as exmoney FROM PRIVATE.dbo.MonthSalaryDetail AS MS JOIN PRIVATE.dbo.Employ AS E ON MS.EmpNO = E.EMPNO WHERE (MS.[Month] BETWEEN '10111' AND '10211' ) AND E.WK_ID LIKE 'D1021%' GROUP BY E.WK_ID , MS.[MONTH] UNION ALL SELECT G.[MONTH], CASE WHEN G.WK_ID='D2031'OR G.WK_ID='D2032' THEN 'D203' ELSE G.WK_ID END WK_ID, 0 as haspaid, sum(HASPAID) AS exmoney FROM ( SELECT E.WK_ID, (right(replicate('0', 3) + cast(year(H.DATE) - 1911 AS VARCHAR), 3) + right(REPLICATE('0', 2) + cast(month(H.DATE) AS VARCHAR), 2)) AS [MONTH], H.Salary AS HASPAID FROM PRIVATE.dbo.HolidaySalary AS H JOIN PRIVATE.dbo.Employ AS E ON H.EmpNO = E.EMPNO WHERE (H.DATE BETWEEN '20121101' AND '20131130') AND E.WK_ID LIKE 'D1021%' ) AS G GROUP BY G.WK_ID, G.[MONTH] ) AS CS where cs.wk_id= 'D1021' GROUP BY CS.MONTH
只拿掉[32、33]、[48]這兩個多餘的 WHERE 條件來進行改善,下面是改善前後的比較
Logical Read 比較表(只列出有變化的 Table)
Table 名稱 | 修改前 | 修改後 |
---|---|---|
PMWKOK | 242,910 | 9,689 |
PMSetOrder | 36,026 | 10,972 |
MonthSalaryDetail | 3,473 | 714 |
CPU Time 比較表
修改前 | 修改後 | |
---|---|---|
CPU Time (ms) | 344 | 171 |
這不知道是第 N 次發現同事下重覆 WHERE 條件,原是希望藉此來限制資料量,但沒想到此舉也造成反效果
沒有留言:
張貼留言