3

SQL Server 2008 OPTIMIZE FOR UNKNOWN 쿼리 힌트를 읽었습니다. 어떻게 작동하는지 이해합니다.이 그것을 사용하는 경우저장 프로 시저 및 알 수없는 최적화

는 그러나, 나는 에 대한 질문이 있습니다. UDF 내에서 지정할 수 없습니다. 저장 프로 시저 내에서 지정할 수 있습니다. 그러나 다음 this MSDN 블로그 게시물 상태 : 저장 프로 시저로 쿼리를 4.Moving

은 별도의 절차 컨텍스트에 넣을 수 있고, 최적화 볼 그 값을 얻을 수있는 좋은 방법이 될 수 있습니다 (참고 :이 2000뿐만 아니라 SQL 에서 작동) 날 것으로 보인다

하여 최적의 실행 계획을 컴파일하는 SQL 서버를 돕고, "스니핑"는 저장된 프로 시저에 전달 된 매개 변수가 될 것이라고 말 할 수 있습니다. 이는 캐시 된 계획을 다시 검토하거나 다시 컴파일해야 함을 의미합니다 (해당 메커니즘을 알지 못함). 그러나이 옵션은 혼란 스럽습니다. 왜냐하면 OPTIMIZE FOR UNKNOWN에 대한 필요성을 무효화하기 때문입니다.

쿼리 힌트에 대한 MSDN 기사는 내 질문을 다루지 않습니다.

누가이 문제를 해결할 수있는 Microsoft의 포인터를 사용하여 이상적으로 대답 할 수 있습니까? 감사.

답변

7

SQL 컴파일러의 기본 동작은 계획을 최적화하는 데 도움이되는 SP의 첫 번째 실행에서 제공된 매개 변수의 값을 사용하는 것입니다 (this MSDN article on SP recompilation의 2 번과 3 번 참조). 그 계획은 캐쉬를 벗어날 때까지 재사용을 위해 캐시됩니다 - 계획 캐싱 프로세스에 대한 많은 상세 정보가 있습니다 here.

당신이 인용 한 MSDN 블로그는이 프로세스를 컴파일러에서보다 쉽게 ​​수행 할 수있는 방법을 알려줍니다. 제 4 항목 (질문에서 인용)은 이것이 임시 SQL에 대한 저장 프로 시저의 장점이라고 제안합니다.

OPTIMIZE FOR UNKNOWN 힌트는 컴파일러에게 aviod에 기본 동작을 지시합니다. 첫 번째 실행에서 주어진 매개 변수 값을 무시하고 더 일반화 된 계획을 선택해야합니다. 이것은 질문에 인용 된 블로그 게시물의 마지막에있는 제안 목록에있는 항목 2의 극단적 인 버전입니다. 당신이 최적화 좋은, 일반적인 쿼리를 얻을 수있는 대표적인 "평균"값으로 매개 변수 힌트를 사용하는 것이 좋습니다 것을 성능 특성을 변화 한 시간이 지남에 따라 서로 다른 계획을 따기 것을 발견 할 경우

2 모든 값에 대해서는 합리적으로 일할 계획입니다.

평균 또는 대표 값을 선택하는 대신 컴파일러는 매개 변수 값을 완전히 무시합니다.

두 조건에 인용 된 상황에서 OPTIMIZE FOR UNKNOWN을 사용하는 것을 고려하십시오. 일반적으로 쿼리의 매개 변수가 매우 가변적 인 카디널리티의 열을 필터링 할 때 같은 상황에서 계획이 좋지 않아 동일한 쿼리가 매우 다양한 성능을 제공합니다.

+0

감사합니다. 따라서 SQL Server는 첫 번째 실행에서 매개 변수를 "감지하여 결과 계획을 캐싱합니다. 따라서이 계획을 이후에 스니핑하지 않으므로 새로운 계획이 보장되는 일정한 상태가 저장됩니다.나는이 권리를 얻었 는가? – IamIC

+0

@Ed 이렇게하면 해결됩니다. 감사합니다. 나에게있어 거의 항상 힌트를 사용해야하는 것으로 보입니다. 그렇지 않으면 가장 먼저 실행 된 계획의 자비에 남겨집니다. 최적 계획에 가깝거나 그렇지 않을 수도 있습니다. 실제로 새로운 DB에서 ID 값이 낮을 가능성이 높다는 것을 고려하면 인덱스 검색이 계획에서 건너 뛸 수 있음을 거의 보장합니다. – IamIC