2013-02-20 2 views
0

데이터베이스에서 모든 실행을 가져와야하지만이 실행에 오류가 있으면 표시해야합니다.3 테이블을 사용하여 TSQL 쿼리 최적화

3 표 :

  • 런은 : 실행 중
  • 메시지 처리 된 파일 ID를 포함 : 다음 실행)
  • Runfiles 포함 오류, 경고를 포함을 ...

이 쿼리를 더 이상 최적화 할 수 있습니까?

SELECT TOP 1000 runid, 
      start, 
      end, 
      userid, 
      CASE 
       WHEN EXISTS(SELECT rf.fk_fileid 
          FROM runfiles rf 
          WHERE rf.fk_runid = r.runid 
           AND EXISTS(SELECT m.messageid 
              FROM messages m 
              WHERE m.fk_fileid = 
                rf.fk_fileid 
                AND m.fk_statusid = 4)) 
      THEN 1 
       ELSE 0 
      END     AS ContainsError 
FROM runs r 
ORDER BY start DESC 

테이블 이름에 대해 언급하지 마십시오, 그들은이 질문에 대한 번역되었다.

감사합니다.

+0

실행 계획을보고 적절한 인덱스를 추가하십시오. – Magnus

+0

"최적화 된"이란 의미는 무엇입니까? 성능에 대해 질문하는 경우 쿼리의 실행 계획을 포함해야합니다. 가독성이나 유지 보수성 향상에 대해 질문하는 경우 [코드 검토 사이트] (http://codereview.stackexchange.com/)가 더 나은 곳입니다. – Pondlife

+0

가끔씩 다른 옵션을 비교하면됩니다. 러 파일과 메시지에 대해 왼쪽 조인을 사용해 보셨습니까? – Narnian

답변

0

이 시도 : 선택 목록에

SELECT TOP 1000 
    r.runid 
    ,r.start 
    ,r.[end] 
    ,r.userid 
    ,CASE WHEN m.messageid IS NOT NULL THEN 1 ELSE 0 END AS ContainsError 
FROM runs r 
LEFT JOIN runfiles rf 
    ON rf.fk_runid = r.runid 
LEFT JOIN [messages] m 
    ON m.fk_fileid = rf.fk_fileid 
    AND m.fk_statusid = 4 
ORDER BY r.start DESC 

아무거나는 결과 집합의 각 행에 대해 실행됩니다. 즉, CASE 문에 중첩 된 하위 쿼리가 각각 TOP 1000 개의 행에 대해 실행되고 있음을 의미합니다.

기본 조인이 null인지 확인하기 위해 왼쪽 조인과 CASE 문을 사용하면 전체 문을 SQL Server가 수행 할 수있는 집합으로 평가할 수 있습니다. 이 방법으로 더 잘 수행되어야합니다.

+0

관계 Run <-> RunFile은 일대 다 관계이며 Runfile <-> 메시지의 관계는 일대 다입니다. 따라서이 쿼리는 동일한 실행을 여러 번 반환합니다. 어쩌면 조인 결과의 수를 제한하는 방법이있을 수 있습니다. 나는 그것을 들여다 볼 것이다. 감사! – Nullius