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 초 내에 실행됩니다.
이것은 금융 응용 프로그램 인 것으로 보입니다. 그 NOLOCK 힌트는 당신에게 어떤 시점에서 심각한 문제를 일으킬 것입니다. 그 힌트는 모든 뉘앙스를 이해하지 못한 성능 도구는 아닙니다. 대부분의 사람들이 깨닫는 것보다 훨씬 더 불길한 것입니다. http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –
최대한 최적화하기 위해 더 많은 정보가 필요합니다. 테이블 구조, 인덱스 정의, 대략 행 수, 현재 시스템의 실제 실행 계획. 질의를 던지기 만해도 성능이 향상되지는 않습니다. –
예 인덱스 정의와 테이블 정의를보고 싶습니다. –