2011-05-09 4 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

+2

DeliveryItems.Delivery 및 Deliveries.ID에 올바른 인덱스가 있습니까? – spender

+0

Retagged - ASP.Net 항목은 관련이 없습니다. 이것은 순수한 SQL입니다. – RichardW1001

답변

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