최적화된 중첩 루프 또는 일괄 처리 정렬을 사용하는 쿼리에서 높은 CPU 또는 메모리 부여가 발생할 수 있습니다.
이 문서는 SQL Server 쿼리를 실행할 때 높은 CPU 사용량이 발생하는 문제를 resolve 데 도움이 됩니다.
적용 대상: SQL Server
원래 KB 번호: 2009160
증상
동시 워크로드가 매우 많은 Microsoft SQL Server 운영하는 경우 쿼리에서 몇 가지 성능 문제가 발생할 수 있습니다. 이 동작은 중간에서 높은 CPU 사용량 또는 극단적인 메모리 부여 요청으로 나타날 수 있습니다.
OOM 조건, 계획 캐시 제거를 위한 메모리 압력 또는 예기치 않은 RESOURCE_SEMAPHORE
대기와 같은 다른 부작용이 발생할 수도 있습니다.
또한 CPU 또는 메모리를 많이 사용하는 쿼리에 대한 쿼리 계획에는 중첩 루프 조인 연산자에 대한 OPTIMIZED 특성이 True로 설정된 것을 알 수 있습니다.
원인
이 문제는 SQL Server 쿼리 프로세서에서 성능을 개선하기 위한 선택적 정렬 작업을 도입하는 경우에 발생할 수 있습니다. 이 작업을 "최적화된 중첩 루프" 또는 "일괄 처리 정렬"으로 알려져 있으며 쿼리 최적화 프로그램은 이러한 연산자를 가장 잘 도입할 시기를 결정합니다. 드문 경우지만 쿼리는 몇 개의 행에만 영향을 주지만 정렬 작업에 대한 설정 비용이 너무 커서 최적화된 중첩 루프의 비용이 그 이점보다 큽니다. 따라서 이러한 경우 예상과 비교하여 성능이 느려질 수 있습니다.
해결 방법
추적 플래그 2340
이 문제를 해결하려면 추적 플래그 2340을 사용하여 최적화를 사용하지 않도록 설정합니다. 추적 플래그 2340은 쿼리 계획을 생성할 때 최적화된 중첩 루프 조인에 정렬 작업(일괄 정렬)을 사용하지 않도록 쿼리 프로세서에 지시합니다. 이는 전체 instance 영향을 줍니다.
이 추적 플래그를 사용하도록 설정하기 전에 애플리케이션을 철저히 테스트하여 이 최적화를 사용하지 않도록 설정할 때 예상되는 성능 이점을 얻을 수 있는지 확인할 수 있습니다. 이는 계획에서 처리되는 행 수가 크게 증가할 때 정렬 최적화가 유용할 수 있기 때문입니다.
자세한 내용은 DBCC TRACEON - 추적 플래그(Transact-SQL)를 참조하세요.
DISABLE_OPTIMIZED_NESTED_LOOP 힌트를 사용하도록 코드 수정
또는 다음 DISABLE_OPTIMIZED_NESTED_LOOP
쿼리 힌트를 적용하여 쿼리 수준에서 최적화를 사용하지 않도록 설정합니다.
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (USE HINT (DISABLE_OPTIMIZED_NESTED_LOOP));
자세한 내용은 DISABLE_OPTIMIZED_NESTED_LOOP 참조하세요.
추가 정보
적용 대상
- SQL Server 2005~SQL Server 2019