이 문제를 해결하는 방법은 무엇입니까?
당신의 질문은 사방에,그래서 나는 그들 모두를 해결하기 위해 노력할 것입니다. 프로 시저 캐시는 너무 큽니다. 프로시저 캐시가 단일 사용 계획으로 채워졌을 수 있습니다(통계가 계획 캐시에 영향을 줄 수는 있지만 통계에 영향을 미치지 않음). 단일 사용 계획에 대한 자세한 내용은 킴벌리 트립의 블로그 게시물에서 확인할 수 있습니다. 그녀가 알 수 있듯이,당신은 임시 워크로드에 대한 최적화를 사용하여 팽만감을 방지 할 수 있습니다. 이 작업을 자주 수행 할 필요성을 찾는 경우 작업으로 프리 프로 캐시를 예약하는 것이 해결책이 아닌 반창고라고 말할 수 있습니다.
“나쁜”계획을 지우려면 먼저”나쁜”계획을 식별해야합니다. 이 계획은 특정 크기를 초과하거나 한동안 실행되지 않았거나 장기 실행 쿼리 등으로 식별한 계획일 수 있습니다. 불행히도 영향을 받는 쿼리를 이미 알고 있지 않으면 매개 변수 스니핑의 피해자가 되는 계획을 식별하는 것은 간단하지 않습니다. 캐시에서 일주일 동안 실행되지 않은 가장 오래된 계획을 찾으려고 한다고 가정해 보겠습니다:
;WITH x AS ( SELECT TOP 10 qs., qs.plan_handle, txs = qs.statement_start_offset, txe = qs.statement_end_offset, = cp.size_in_bytes, = SUM(cp.usecounts), = MAX(qs.last_execution_time) FROM sys.dm_exec_query_stats AS qs INNER JOIN sys.dm_exec_cached_plans AS cp ON qs.plan_handle = cp.plan_handle WHERE qs.last_execution_time < DATEADD(DAY, -7, CURRENT_TIMESTAMP) GROUP BY qs., qs.plan_handle, cp.size_in_bytes, qs.statement_start_offset, qs.statement_end_offset ORDER BY DESC) SELECT x.plan_handle, size, uses, , = COALESCE(NULLIF( SUBSTRING(t., x.txs/2, CASE WHEN x.txe = -1 THEN 0 ELSE (x.txe - x.txs)/2 END ), ''), t.) FROM x CROSS APPLY sys.dm_exec_sql_text(x.) AS t;
지금 너는 너가 진짜로 이 계획에서 맑게 하고 싶는 것을 확인한것을 필요로 한다. 예를 들어,만약 당신이 그 질의를 대표이사가 내일 실행할 수 있는 것으로 인식한다면,아마도 그것을 거기에 두는 것이 최선일 것이다. 당신이 계획을 취소 할 경우,당신은 말하여 직접 취소 할 수 있습니다:
DBCC FREEPROCCACHE();
이것은 전 세계적으로DBCC FREEPROCCACHE
를 실행하는 것보다 훨씬 더 많은 작업처럼 들리지만 캐시에 좋은 계획이 많으면 전반적으로 사용자에게 더 좋을 것입니다.
그래도 정말 반창고처럼 들린다. 캐시가 정크로 채워지고 캐시를 확보 할 때까지 성능이 변기에 들어가면 아키텍처에서 더 높은 수준,쿼리 제출 방법 등을 살펴볼 필요가 있습니다. 여기서 길이가 다른 각 문자열 인수에 대한 쿼리에 대한 계획 버전을 캐시합니다. 따라서’1 월’매개 변수가 있으면 데이터 유형을VARCHAR(7)
대VARCHAR(8)
로 정의하기 때문에’2 월’매개 변수와는 다른 계획을 얻을 수 있습니다. 그 동작은 고정되어 있지만”나쁜 아이디어”를 정확하게 찾을 위치를 제안하기 위해 환경/응용 프로그램에 대해 충분히 알지 못합니다.”