2014-04-09 2 views
0

이 쿼리는 SqlServer 2008 R2에서 실행되며 약 6 초가 걸리고 약 8000 개의 레코드가 반환됩니다. OrderItemView은보기이며 DocumentStationHistory은 테이블입니다.동일한 쿼리의 실행 시간이 다릅니다. SQL Server 2008 R2

SELECT o.Number, dsh.DateSend AS Expr1 
FROM OrderItemView AS o INNER JOIN 
     DocumentStationHistory AS dsh ON dsh.DocumentStationHistoryId = 
      (SELECT TOP (1) DocumentStationHistoryId 
      FROM   DocumentStationHistory AS dsh2 
      WHERE  (o.DocumentStationId = ToStationId) AND 
      (DocumentId = o.id) 
      ORDER BY DateSend DESC) 
WHERE  (o.DocumentStationId = 10) 

하지만 where 절, 그것은 약 200 레코드를 반환하지만, 약 90 초 정도 걸릴 o.DocumentStationId = 8과 같은 쿼리를 실행할 때!

문제가 어디에 있는지 생각해보십시오.

+2

자세한 내용은 쿼리 계획을 확인하십시오. 옵티마이 저가 변경 사항에 따라 다른 계획을 선택하고 있다고 가정합니다. – frlan

+2

'o.DocumentStationId'에 색인이 있습니까? – Raj

+0

동일한 결과를 갖는 동일한 캐시 된 계획을 사용 중일 수 있습니다. 두 쿼리에 대한 실제 실행 계획을 비교하고 다시보고하십시오. – dean

답변

1

당신에게 실행 계획을 게시 할 수 있습니다.

1

색인이 문제 일 것이라고 가정하지만 o.DocumentStationId은 아니지만 o.DocumentStationId 필드를 사용하여 조인 된 모든 필드가 있습니다.

실행 계획을 확인하여 내부 쿼리가 어떻게 작동하는지 확인하십시오. 일부 성능 조정이 필요한 입니다.

또한 ToStationIdDateSend에 대한 색인을 사용해보십시오. 또한 내부 쿼리를 수정할 수 있는지 확인하십시오.

이외의 다른 제안 사항은 없습니다.

또한 내가 o.DocumentStationId에 인덱스를 재 구축하고 문제가 해결

0

다음 쿼리를 사용해보십시오. 또한 DocumentStationId, ToStationId 및 DocumentId에 대한 색인이 있는지 확인하십시오. 만들지 않을 경우

SELECT o.Number, dsh.DateSend AS Expr1 
FROM OrderItemView AS o 
OUTER APPLY 
    (SELECT TOP (1) DateSend 
     FROM DocumentStationHistory 
     WHERE (o.DocumentStationId = ToStationId) AND (DocumentId = o.id) 
     ORDER BY DateSend DESC) AS dsh 
WHERE (o.DocumentStationId = 10)