2013-01-14 80 views
-2

我有這個疑問這需要2分鐘,甚至執行的時間並不長:有沒有什麼辦法來優化這個SQL Server查詢?

SELECT MTI.DeptID, 
     ShortEmployees.EmpID, 
     ShortEmployees.EmpName1 AS EmpName, 
     Sum(CASE 
      WHEN (BSR.BSTID = 3 
        AND bli.state IN (12, 13, 14)) THEN -1 * ((BLD.Qty/dbo.Getunitval(BLD.UnitID, BLD.MTID)) * BLD.Price - ((BLD.Qty/dbo.Getunitval(BLD.UnitID, BLD.MTID)) * BLD.Price * BLD.discount * 0.01)) 
      ELSE ((BLD.Qty/dbo.Getunitval(BLD.UnitID, BLD.MTID)) * BLD.Price - ((BLD.Qty/dbo.Getunitval(BLD.UnitID, BLD.MTID)) * BLD.Price * BLD.discount * 0.01)) 
      END) AS Total 
FROM BLD 
     INNER JOIN BLI 
     ON BLD.BLNo = BLI.BLNo 
     INNER JOIN BSR 
     ON BLI.BLID = BSR.BLID 
     INNER JOIN ShortEmployees 
     ON BLI.EmpID = ShortEmployees.EmpID 
     INNER JOIN MTI 
     ON BLD.MTID = MTI.MTID 
WHERE (MTI.DeptID = 'B') 
     AND (BLI.BLDate > Cast('2013-01-01 00:00:00' AS DATETIME)) 
     AND (BLI.BLDate < Cast('2013-01-14 23:59:59' AS DATETIME)) 
     AND ((BSR.BSTID = 2 
      AND bli.state IN (2, 6, 8, 9, 
           10, 12, 18)) 
      OR (BSR.BSTID = 3 
       AND bli.state IN (12, 13, 14))) 
GROUP BY ShortEmployees.EmpName1, 
      ShortEmployees.EmpID, 
      MTI.DeptID 
ORDER BY Total DESC 

我如何優化呢?

MTI:物品信息表。

BLI:賬單表。

BLD:Bill details table。

ShortEmployees:Salesmen表。

+8

第一步是打破在更好的格式化行中查詢,以便人們甚至可以開始嘗試優化它 –

+2

你對這些表有什麼索引? – Bridge

+3

是的,你可以優化'dbo.Getunitval';) –

回答

0

最後,我結束了該查詢轉換成整個存儲過程不同的是巨大的!現在只需要2秒:),謝謝大家特別的憎恨斯潘基;)

1

移動的條件進入JOKN ON子句在那裏他們可以作爲應用聯接而成,而非畢竟過濾加入已經作出:

SELECT MTI.DeptID, 
     ShortEmployees.EmpID, 
     ShortEmployees.EmpName1 AS EmpName, 
     Sum(CASE 
      WHEN (BSR.BSTID = 3 
        AND bli.state IN (12, 13, 14)) THEN -1 * ((BLD.Qty/dbo.Getunitval(BLD.UnitID, BLD.MTID)) * BLD.Price - ((BLD.Qty/dbo.Getunitval(BLD.UnitID, BLD.MTID)) * BLD.Price * BLD.discount * 0.01)) 
      ELSE ((BLD.Qty/dbo.Getunitval(BLD.UnitID, BLD.MTID)) * BLD.Price - ((BLD.Qty/dbo.Getunitval(BLD.UnitID, BLD.MTID)) * BLD.Price * BLD.discount * 0.01)) 
      END) AS Total 
FROM BLD 
JOIN BLI ON BLD.BLNo = BLI.BLNo 
    AND BLI.BLDate BETWEEN Cast('2013-01-01 00:00:00' AS DATETIME) 
     AND Cast('2013-01-14 23:59:59' AS DATETIME) 
JOIN BSR ON BLI.BLID = BSR.BLID 
    AND ((BSR.BSTID = 2 
      AND bli.state IN (2, 6, 8, 9, 10, 12, 18) 
     OR (BSR.BSTID = 3 
      AND bli.state IN (12, 13, 14)) 
JOIN ShortEmployees ON BLI.EmpID = ShortEmployees.EmpID 
JOIN MTI ON BLD.MTID = MTI.MTID 
    AND MTI.DeptID = 'B' 
GROUP BY ShortEmployees.EmpName1, 
    ShortEmployees.EmpID, 
    MTI.DeptID 
ORDER BY Total DESC 

注意,我改變了日期範圍檢查之間,因爲你的查詢排除了期間的第一個和最後一個秒。

我也刪除不必要的括號和縮進

+0

以前它是在1點53分,現在是1點55分:D沒有太大的區別。 – Mhdali

0

有關更多的優化,變量移動CAST(「XXXXX」 AS DATETIME):

DECLARE @dmin DATETIME= Cast('2013-01-01 00:00:00' AS DATETIME); 
DECLARE @dmax DATETIME= Cast('2013-01-14 23:59:59' AS DATETIME); 
SELECT [blah] 
FROM [blahblah] 
WHERE (MTI.DeptID = 'B') 
     AND (BLI.BLDate BETWEEN @dmin AND @dmax) 
etc 
相關問題