일반적인 용의자 :
- 임시의 상수, 코드의 매개 변수
- 코드에서 데이터 유형의 불일치
- 매개 변수 스니핑
포인트 1 : 옵티마이 저는 상수에 가장 적합한 계획을 선택할 수 있습니다.
상수 변경 = 계획 변경 매개 변수화 된 plen이 재개 가능
포인트 2는 데이터 유형 우선 순위 때문에 암시 적 변환을 도입합니다 (
예 : nvarchar 매개 변수와 비교 한 varchar 열)
포인트 3 : 매개 변수 마스킹 또는 알 수없는 OPTIMIZE FOR
편집 사용 편집 : 테스트 : 저장 프로 시저를 실행하고 sp_updatestats를 실행 한 후 다시 실행하십시오. 캐시 된 계획을 무효화하여 계획 캐시를 지우는 것이 좋습니다.
편집 : jcolebrand의 의견 후
스니핑을 여러 가지 방법으로 비활성화 할 수 있습니다. 주요 3
- 추천합니다. 이것은 바보 같은 IMO입니다.
- 알 수없는 최적화 (sic)
- 파라미터 마스킹
매개 변수 마스킹 :
DECLARE @MaskedParam varchar(10)
SELECT @MaskedParam = @SignaureParam
SELECT...WHERE column = @MaskedParam
마스킹과 OPTIMIZE 힌트는 동일한 효과를 갖습니다 (다른 이유로도 가능). 즉, 옵티마이 저는 통계 및 데이터 분포를 사용해야합니다 ( 참고 : Mark Storey-Smith에서 테스트중인 테스트 ) 는 자체 장점에 따라 매개 변수를 평가해야 합니까? , 그들이 마지막으로 부른 것이 아니라. 옵티마이 저는 다시 컴파일 할 수 있습니다. SQL Server 2005는 문 수준 재 컴파일을 추가하여 영향을 줄였습니다.
이제 "스니핑 된"매개 변수가있는 계획이 마스크 된 / "알 수없는"매개 변수와 비교하여 "고정적"인 이유는 확실하지 않습니다.
가장 간단한 코드를 제외하고 SQL Server 2000부터 매개 변수 마스킹을 사용했습니다. 더 복잡한 코드로 발생하기 쉽다고 언급했습니다. 그리고 내 이전 직장에서 계획 매개 변수 기본값을 변경할 수있는 몇 가지 보고서 프로세스가 있습니다. "화물 숭배"접근법은 지원 요청보다 쉽다고 생각합니다.
채팅 후 2011 년 10 월 2 일 2 일 수정
알 수없는 한 매개 변수 마스킹 및 OPTIMIZE FOR UNKNOWN은
힌트가 마스킹보다 깨끗하지만 SQL Server 2008에 추가되었습니다.
컴파일시 매개 변수 스니핑이 발생합니다.
WITH RECOMPILE은 실행될 때마다 새 계획을 생성합니다. 이는 기본 설정을 잘못 선택하면 계획에 영향을 미칩니다. 마지막 작업에서 일부 보고서 코드를 사용하여이를 쉽게 보여줄 수있었습니다. 매개 변수 기본값을 변경하면 제공된 매개 변수에 관계없이 계획이 변경되었습니다.
이 MS Connect 기사는 흥미 롭습니다 : 저장 프로 시저 내에서 차선의 인덱스 사용 (아래 SO 답변 중 하나에서 언급)
- Bob Beauchemin도 언급
뛰어난 문제
WITH RECOMPILE과 함께 스니핑이 계속 적용됩니까? 즉, 옵티마이 저가 계획을 폐기하는 것을 알고 있다면 재사용을 목표로 하는가?
스니핑 된 계획이 "끈적 거리는"이유는 무엇입니까?
SO 링크 :
WHERE
절 에서 변수를 참조합니까 ?