2016-10-27 7 views
1

이 쿼리를 최적화 할 수 있습니까? 현재 아래 쿼리를 실행하는 데 30 분 정도 걸립니다.MSSQL 쿼리 최적화 (하위 쿼리, 상관 하위 쿼리)

하위 쿼리로 시도했지만 대신 Outer Apply을 추가했지만 성능이 향상되지 않았습니다. 이 성능을 어떻게 향상시킬 수 있습니까? 어떤 도움은 대단히 감사하겠습니다

SELECT invoiceno, 
     dealno, 
     customerno, 
     vendorno, 
     previous1 = (SELECT TOP 1 CASE @Tax 
            WHEN 0 THEN (i1.invoicetotal - i1.invoicetax) 
            ELSE i1.invoicetotal 
           END 
        FROM invoiceview i1 WITH (NOLOCK) 
        WHERE --ii1.orderid= 
        i1.orderid = do.orderid 
        AND i1.invoiceno != i.invoiceno 
        AND i1.billingend < i.billingend 
        AND i1.status NOT IN ('ESTIMATE', 'VOID') 
        ORDER BY i1.billingend DESC), 
     previousstatus1 =(SELECT TOP 1 Rtrim(i1.status) 
         FROM invoiceview i1 WITH (NOLOCK) 
         --join invoiceitem ii1 with (nolock) on i1.invoiceid = ii1.invoiceid 
         WHERE --ii1.orderid= 
          i1.orderid = do.orderid 
          AND i1.invoiceno != i.invoiceno 
          AND i1.billingend < i.billingend 
          AND i1.status NOT IN ('ESTIMATE', 'VOID') 
         ORDER BY i1.billingend DESC) 
FROM invoiceview iv 
     LEFT OUTER JOIN dealorder do 
        ON iv.orderid = do.orderid 
     LEFT OUTER JOIN invoice i 
        ON iv.invoiceid = i.invoiceid 
     LEFT OUTER JOIN deal d 
        ON d.dealid = do.dealid 
/*OUTER APPLY (SELECT TOP 1 RTRIM(i1.status) as previousstatus1, (CASE @Tax WHEN 0 THEN (i1.invoicetotal - i1.invoicetax) ELSE i1.invoicetotal END) as previous1 
     FROM invoiceview i1 with (nolock) 
     WHERE i1.orderid = do.orderid and i1.invoiceno ! = i.invoiceno and i1.billingend  ) as a */ 

: 여기

는 쿼리입니다. 이전 상태가 없으면 previousstatus1 쿼리는 기껏해야 10 초 내에 실행됩니다.

+3

이것은 금융 응용 프로그램 인 것으로 보입니다. 그 NOLOCK 힌트는 당신에게 어떤 시점에서 심각한 문제를 일으킬 것입니다. 그 힌트는 모든 뉘앙스를 이해하지 못한 성능 도구는 아닙니다. 대부분의 사람들이 깨닫는 것보다 훨씬 더 불길한 것입니다. http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+4

최대한 최적화하기 위해 더 많은 정보가 필요합니다. 테이블 구조, 인덱스 정의, 대략 행 수, 현재 시스템의 실제 실행 계획. 질의를 던지기 만해도 성능이 향상되지는 않습니다. –

+0

예 인덱스 정의와 테이블 정의를보고 싶습니다. –

답변

0

모든 도움 주셔서 감사합니다. 나는 그 문제를 알아낼 수 있었다. 그것은 뷰였습니다. 기본 테이블과 조인하고 하위 쿼리가 아닌 외부 조인을 실제로 수행하면 상당한 차이가 있음을 알게되었습니다.