RECOMPILE 쿼리 힌트를 사용하는 경우 쿼리 간 실행 시간의 큰 차이


16

동일한 SQL Server 2005 인스턴스에서 실행되는 거의 동일한 쿼리가 두 개 있습니다.

  1. 첫 번째는 SELECTLINQ에 의해 생성 된 원래 쿼리입니다 (알고 있습니다 ... 나는 응용 프로그램 개발자가 아니라 DBA :).
  2. 두 번째 것은 첫 번째와 정확히 동일 OPTION (RECOMPILE)하며 끝에 추가되었습니다 .

다른 것은 바뀌지 않았습니다.

첫 번째는 실행될 때마다 55 초가 걸립니다.
두 번째는 2 초가 걸립니다.

두 결과 집합이 동일합니다.

이 힌트가 성능을 크게 향상시키는 이유는 무엇입니까?

온라인 설명서 항목 RECOMPILE에는 자세한 설명이 없습니다.

쿼리 실행 후 쿼리에 대해 생성 된 계획을 삭제하도록 SQL Server 데이터베이스 엔진에 지시하여 다음에 같은 쿼리가 실행될 때 쿼리 최적화 프로그램이 쿼리 계획을 다시 컴파일하도록합니다. RECOMPILE을 지정하지 않으면 데이터베이스 엔진은 쿼리 계획을 캐시하고이를 재사용합니다. 쿼리 계획을 컴파일 할 때 RECOMPILE 쿼리 힌트는 쿼리에서 로컬 변수의 현재 값을 사용하고 쿼리가 저장 프로 시저 내에 있으면 현재 값이 모든 매개 변수에 전달됩니다.

RECOMPILE은 전체 저장 프로 시저 대신 저장 프로 시저 내의 쿼리 하위 집합 만 다시 컴파일해야하는 경우 WITH RECOMPILE 절을 사용하는 저장 프로 시저를 만드는 유용한 대안입니다. 자세한 내용은 저장 프로 시저 다시 컴파일을 참조하십시오. RECOMPILE은 계획 지침을 작성할 때도 유용합니다. 자세한 내용은 계획 지침을 사용하여 배포 된 응용 프로그램에서 쿼리 최적화를 참조하십시오.

내 쿼리에는 많은 로컬 변수가 있기 때문에 OPTION (RECOMPILE)쿼리 힌트를 사용할 때 SQL Server가 (잘못) 최적화 할 수 있다고 생각 합니다.

나는 사람들이 OPTION (RECOMPILE)피해야한다고 말하는 모든 곳에서 . 이에 대한 설명은 일반적으로이 힌트를 사용하면 SQL Server가이 실행 계획을 재사용 할 수 없으므로 매번 다시 컴파일하는 데 시간을 낭비해야한다는 것입니다.
(그러나) 거대한 성능 이점을 감안할 때 이번에는이 쿼리 힌트를 사용하는 것이 좋을 것이라고 생각합니다.

사용해야합니까? 그렇지 않다면 SQL Server 가이 힌트없이 응용 프로그램을 변경하지 않고 더 나은 실행 계획을 사용하도록 할 수 있습니까?

답변:


16

Microsoft SQL Server 2005의 Query Optimizer에서 사용하는 통계 기사에 설명 된대로

매개 변수 나 리터럴 대신 쿼리 술어에 로컬 변수를 사용하는 경우, 옵티마이 저는 품질 추정치 나 술어의 선택성을 추측합니다. 로컬 변수 대신 쿼리에서 매개 변수 또는 리터럴을 사용하십시오.

옵티마이 저가 열에 대해 사용 가능한 통계가 전혀 없으면 술어가 행의 10 %, 9 %에 일치 하고 어떤 것이 든 30 % 와 일치 한다고 추측 합니다 . 사용 가능한 열 통계가있는 경우 술어는 아래와 같이 다르게 처리됩니다.=BETWEEN>, >=, < and <==

로컬 변수가 쿼리에 사용되는 경우에도 등식 술어의 경우 추측보다 나은 추정값이 사용됩니다. " @local_variable = column_name" 형식의 조건에 대한 선택성은 column_name에 대한 히스토그램의 평균 값 빈도를 사용하여 추정됩니다. 예를 들어 column_name 열에 모든 고유 값이 포함되어 있으면 선택성 추정값 1/(number of unique values in column)이 사용됩니다. 이는 정확합니다.

따라서 이것은 for 사용하는 것과 본질적으로 동일합니다 OPTIMIZE FOR (UNKNOWN). 평범한 10%추측 보다 더 정확할 수도 있지만 쿼리하는 특정 값에 맞지 않습니다.

SQL Server가 쿼리를 실행할 때마다 쿼리를 최적화하고 쿼리를 최적화하는 동안 로컬 변수 값을 사용하여 카디널리티 및 비용을 추정하려면 RECOMPILE쿼리 힌트를 쿼리에 추가하십시오 .

RECOMPILE당신을 사용 하면 아마도 더 정확한 카디널리티 추정치를 얻으므로 실제 쿼리의 다른 부분에서 반환 된 행 수에 더 적합한 조인 순서 / 조인 유형을 가진 다른 계획이 생길 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.