설명하는 동작은 잘못 캐시 된 쿼리 계획 및/또는 오래된 통계 때문일 수 있습니다.
그것은 일반적으로 당신이 절의 형식은 그 사람들의, 특히 긴 목록 WHERE A의 매개 변수의 수가 많은 경우에 발생합니다
(@parameter1 is NULL OR TableColumn1 = @parameter1)
말은, 캐시 된 쿼리 계획이 만료하고, PROC 대표가 아닌 매개 변수 세트로 호출됩니다. 계획은이 데이터 프로파일에 대해 캐시됩니다. 하지만, proc이 매우 다른 매개 변수 집합과 더 자주 사용되는 경우 계획이 적절하지 않을 수 있습니다. 이것은 종종 '매개 변수 스니핑'으로 알려져 있습니다.
이 문제를 완화하고 제거하는 방법이 있지만 트레이드 오프가 포함될 수 있으며 SQL Server 버전에 따라 달라질 수 있습니다. OPTIMIZE FOR
및 OPTIMIZE FOR UNKNOWN
을 확인하십시오. IF (그리고 큰 경우)는 자주 호출되지 않지만 가능한 한 빨리 실행해야합니다. OPTION(RECOMPILE)
으로 표시하여 호출 할 때마다 강제로 다시 컴파일하지만 자주 호출되는 procs 또는 조사는 수행하지 마십시오 .
[참고 : 재 컴파일 및 매개 변수는 논리를 스니핑하는 일부 버전에서 다르게 작동하기 때문에, 당신의 SQL 서버 2008 상자가 가지고있는 Service pack and Cumulative Update (CU) 인식]
실행 (글렌 베리에서)이 쿼리 통계의 상태를 결정하기를 :
-- When were Statistics last updated on all indexes?
SELECT o.name, i.name AS [Index Name],
STATS_DATE(i.[object_id], i.index_id) AS [Statistics Date],
s.auto_created, s.no_recompute, s.user_created, st.row_count
FROM sys.objects AS o WITH (NOLOCK)
INNER JOIN sys.indexes AS i WITH (NOLOCK)
ON o.[object_id] = i.[object_id]
INNER JOIN sys.stats AS s WITH (NOLOCK)
ON i.[object_id] = s.[object_id]
AND i.index_id = s.stats_id
INNER JOIN sys.dm_db_partition_stats AS st WITH (NOLOCK)
ON o.[object_id] = st.[object_id]
AND i.[index_id] = st.[index_id]
WHERE o.[type] = 'U'
ORDER BY STATS_DATE(i.[object_id], i.index_id) ASC OPTION (RECOMPILE);
자세한 정보가 필요합니다. 어떤 유형의 함수 (스칼라, 테이블 반환 또는 인라인)입니까? 작동하는 테이블의 구조는 무엇입니까? 어떤 색인이 사용 가능하며 어떤 색인을 사용할 것으로 기대합니까? 나쁘게 행동하기 시작했을 때 정확히 무엇을 했습니까? –