Microsoft SQL Server에서 느리게 실행되는 쿼리가 있습니다. 매우 느린 https://www.brentozar.com/pastetheplan/?id=BJUrHRwngMS SQL Server 실제 작업 당 실제 CPU 비용
쿼리됩니다 : 다음은 쿼리 및 실행 계획이다
Table 'Worktable'. Scan count 30, logical reads 184041, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SiteVersions'. Scan count 1, logical reads 363, physical reads 0, read-ahead reads 351, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#BB50937F'. Scan count 1, logical reads 5979, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'AllWebs'. Scan count 11, logical reads 3041, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'AllSites'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 715296 ms, elapsed time = 873728 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
이 이중 인텔 (R) 제온 (R) CPU에 2.70GHz @ E5-2680 0, 2700 MHz의 , 8 코어, 16 논리 프로세서 시스템. 쿼리는 max-dop가 1로 실행됩니다.
실제 실행 계획은 특정 정렬 연산이 가장 큰 예상 비용을 갖고 매우 많은 수의 행을 반환하는 연산이 없음을 나타냅니다.
그러나 실제 실행 계획을 살펴보면 정렬 작업으로 인해 CPU가 모두로드되는 경우는 거의 없습니다. 예를 들어 별도의 독립 실행 형 쿼리에서 정렬 작업을 실행하면 매우 빠릅니다.
성능 킬러가되는 병합 조인이 의심 스럽습니다. 두 개의 평균적으로 큰 행 집합 (29840 및 9557 행, resp)을 조인하므로 매우 많은 수의 조인 된 행이 생성 될 수 있습니다. 그것은 매우 제한적이지 않은 WHERE 절과 각각의 잔여 행에 대해 평가되어야하는 몇 가지 함수가있는 비싼 RESIDUAL 연산을가집니다. 그러나 나는 실제 숫자로 내 의혹을지지 할 수 없다.
- SQL 서버에서 물리적 작업 당보고 된 실제 CPU 비용을 얻을 수있는 방법이 있나요 :
따라서, 나는 나의 의심을 확인할 수 있도록 몇 가지 질문이?
- 실행 된 RESIDUAL 작업의 실제 개수 및/또는 병합 조인 작업에서 WHERE 절 뒤에 남아있는 행 수에 대해보고하는 방법이 있습니까?
- 'Worktable'에서 논리적 읽기가보고 된 184041과 관련된 CPU 비용을 계산하는 방법이 있습니까?
- 물리적 작업이 '작업대'
감사를 사용하여 찾을 수있는 방법이 있나요,
[이 링크] (https://www.brentozar.com/pastetheplan/)는 실행 계획을 공유하는 데 도움이 될 수 있습니다. – DavidG
'OPTION (RECOMPILE)'을 추가해보십시오. 옵티마이 저가 테이블 변수에 대한 통계를 유지하지 않으므로 행을 1 행만 있다고 가정합니다. 실제로 30,000 개의 행이 있으며 전체 행 견적을 상당히 왜곡합니다. 'RECOMPILE'은 최소한 (이것은 문서화되어 있지 않지만 실제로는) 수정되었다. 대신 임시 테이블을 사용합니다. –
링크 @DavidG를 주셔서 감사합니다. 질문을 편집하고 링크를 사용하여 실행 계획 공유를 개선했습니다. –