2011-05-09 90 views
0

我有以下(相當傳統,做了一年或兩年前)SQL查詢。 SQL所在的網頁(在ASP.NET的SqlDataSource/GridView中使用)非常慢,我已經確定了這個查詢的緩慢程度 - 看起來是因爲子選擇。我已經嘗試過使用連接來希望加快速度,但我無法使其工作。有任何想法嗎?加快這個SQL查詢

我不會把整個查詢放在這裏,只是因爲我在沒有互聯網訪問的機器上工作,所以我將無法複製和粘貼,而大部分只是從主表中選擇。

SELECT ..., 
     CASE 
     WHEN di.Total = di.Delivered THEN 'Received' 
     ELSE 'Not Received' END AS 'Status', 
     ... 
FROM Deliveries AS d 
    LEFT OUTER JOIN (
     SELECT Delivery, 
       COUNT(*) AS Total, 
       COUNT(CASE WHEN Status = 2 THEN 1 END) AS Delivered 
     FROM DeliveryItems 
     GROUP BY Delivery 
) AS di ON d.ID = di.Delivery 

任何提示?

+4

您可以從查詢分析器添加執行計劃嗎?這通常會告訴你導致減速的步驟。 – Keith 2011-05-09 08:23:18

+2

您在DeliveryItems.Delivery和Deliveries.ID上有正確的索引嗎? – spender 2011-05-09 08:25:23

+0

重新標記 - ASP.Net的東西是不相關的,這是純粹的SQL – RichardW1001 2011-05-09 08:40:30

回答

0
SELECT Delivery, 
     COUNT(*) AS Total, 
     COUNT(CASE WHEN Status = 2 THEN 1 END) AS Delivered 
FROM DeliveryItems 
GROUP BY Delivery 

這部分可以通過開溝CASE語句來改進。也許嘗試連接兩次,一次是針對總數,一次是針對已過濾的計數。

SELECT ..., 
     CASE 
     WHEN d2.Total = d1.Delivered THEN 'Received' 
     ELSE 'Not Received' END AS 'Status', 
     ... 
FROM Deliveries AS d 

LEFT OUTER JOIN (

SELECT Delivery, 
     COUNT(*) AS Delivered 
FROM DeliveryItems 
WHERE Status = 2 
GROUP BY Delivery) d1 ON d.Id = d1.Delivery 

LEFT OUTER JOIN (

SELECT Delivery, 
     COUNT(*) AS Total 
FROM DeliveryItems 
GROUP BY Delivery) d2 ON d.ID = d2.Delivery