동일한 SQL Server 2005 인스턴스에서 실행되는 거의 동일한 쿼리가 두 개 있습니다.
- 첫 번째는
SELECT
LINQ에 의해 생성 된 원래 쿼리입니다 (알고 있습니다 ... 나는 응용 프로그램 개발자가 아니라 DBA :). - 두 번째 것은 첫 번째와 정확히 동일
OPTION (RECOMPILE)
하며 끝에 추가되었습니다 .
다른 것은 바뀌지 않았습니다.
첫 번째는 실행될 때마다 55 초가 걸립니다.
두 번째는 2 초가 걸립니다.
두 결과 집합이 동일합니다.
이 힌트가 성능을 크게 향상시키는 이유는 무엇입니까?
온라인 설명서 항목 RECOMPILE
에는 자세한 설명이 없습니다.
쿼리 실행 후 쿼리에 대해 생성 된 계획을 삭제하도록 SQL Server 데이터베이스 엔진에 지시하여 다음에 같은 쿼리가 실행될 때 쿼리 최적화 프로그램이 쿼리 계획을 다시 컴파일하도록합니다. RECOMPILE을 지정하지 않으면 데이터베이스 엔진은 쿼리 계획을 캐시하고이를 재사용합니다. 쿼리 계획을 컴파일 할 때 RECOMPILE 쿼리 힌트는 쿼리에서 로컬 변수의 현재 값을 사용하고 쿼리가 저장 프로 시저 내에 있으면 현재 값이 모든 매개 변수에 전달됩니다.
RECOMPILE은 전체 저장 프로 시저 대신 저장 프로 시저 내의 쿼리 하위 집합 만 다시 컴파일해야하는 경우 WITH RECOMPILE 절을 사용하는 저장 프로 시저를 만드는 유용한 대안입니다. 자세한 내용은 저장 프로 시저 다시 컴파일을 참조하십시오. RECOMPILE은 계획 지침을 작성할 때도 유용합니다. 자세한 내용은 계획 지침을 사용하여 배포 된 응용 프로그램에서 쿼리 최적화를 참조하십시오.
내 쿼리에는 많은 로컬 변수가 있기 때문에 OPTION (RECOMPILE)
쿼리 힌트를 사용할 때 SQL Server가 (잘못) 최적화 할 수 있다고 생각 합니다.
나는 사람들이 OPTION (RECOMPILE)
피해야한다고 말하는 모든 곳에서 . 이에 대한 설명은 일반적으로이 힌트를 사용하면 SQL Server가이 실행 계획을 재사용 할 수 없으므로 매번 다시 컴파일하는 데 시간을 낭비해야한다는 것입니다.
(그러나) 거대한 성능 이점을 감안할 때 이번에는이 쿼리 힌트를 사용하는 것이 좋을 것이라고 생각합니다.
사용해야합니까? 그렇지 않다면 SQL Server 가이 힌트없이 응용 프로그램을 변경하지 않고 더 나은 실행 계획을 사용하도록 할 수 있습니까?