" Ad Hoc 워크로드 최적화 "옵션 을 켜면 실행 계획을 컴파일하고 동일한 데이터를 가져 오기 때문에 두 번째로 실행되는 임시 쿼리가 첫 번째 시간만큼 느려집니다 ( 캐시하지 않고) 처음 2 번.
큰 문제는 아니지만 쿼리를 테스트 할 때 알 수 있습니다.
이제이 옵션을 설정 하지 않고 1-Off Ad-Hoc 쿼리로 가득 찬 캐시를 사용 하지 않으면 어떻게됩니까 ?
캐싱 관리 알고리즘 :
이 최적화 기능이 도입되면서 캐싱 관리 알고리즘도 업데이트되었습니다.
Kimberly Tripp의 기사는 이 알고리즘 변경에 대한 Kalen Delaney의 게시물 도 참조 합니다.
그녀는 그것을 가장 잘 설명합니다.
변경 내용은 실제로 SQL Server에서 메모리 부족이 있음을 인식하는 계획 캐시 크기를 계산하여 캐시에서 계획을 제거하기 시작합니다. 제거 할 계획은 재사용되지 않은 저렴한 계획이며, 이것은 좋은 일입니다.
즉, 리소스를 확보해야 할 때 성가신 원 타이머 계획이 가장 먼저 진행됩니다.
이제 질문은 다음과 같습니다.
" 왜 SQL 서버가 필요한 경우 사용되지 않는 계획을 제거 할을 담당 할 때 우리가 '임시 워크로드 최적화'해야합니까? "
정기적으로 비 매개 변수가 광고의 꽃잎을 생성하는 동적 SQL의의 톤이있는 경우 그 내 대답은이다 -질문이 있으면이 기능을 켜는 것이 좋습니다.
최대 캐시 메모리 공간을 사용한 후에는 캐시 된 계획 / 데이터를 강제로 제거하도록 시스템 리소스에 부담을주지 않기를 원합니다.
이 기능을 언제 켜야하는지 어떻게 알 수 있습니까?
다음은 현재 캐시 한 Ad-Hoc Plan의 수와 그들이 차지하는 디스크 공간의 양을 보여주기 위해 작성한 쿼리입니다.
--Great query for making the argument to use "Optimize for Ad Hoc Workloads":
SELECT S.CacheType, S.Avg_Use, S.Avg_Multi_Use,
S.Total_Plan_3orMore_Use, S.Total_Plan_2_Use, S.Total_Plan_1_Use, S.Total_Plan,
CAST( (S.Total_Plan_1_Use * 1.0 / S.Total_Plan) as Decimal(18,2) )[Pct_Plan_1_Use],
S.Total_MB_1_Use, S.Total_MB,
CAST( (S.Total_MB_1_Use * 1.0 / S.Total_MB ) as Decimal(18,2) )[Pct_MB_1_Use]
FROM
(
SELECT CP.objtype[CacheType],
COUNT(*)[Total_Plan],
SUM(CASE WHEN CP.usecounts > 2 THEN 1 ELSE 0 END)[Total_Plan_3orMore_Use],
SUM(CASE WHEN CP.usecounts = 2 THEN 1 ELSE 0 END)[Total_Plan_2_Use],
SUM(CASE WHEN CP.usecounts = 1 THEN 1 ELSE 0 END)[Total_Plan_1_Use],
CAST((SUM(CP.size_in_bytes * 1.0) / 1024 / 1024) as Decimal(12,2) )[Total_MB],
CAST((SUM(CASE WHEN CP.usecounts = 1 THEN (CP.size_in_bytes * 1.0) ELSE 0 END)
/ 1024 / 1024) as Decimal(18,2) )[Total_MB_1_Use],
CAST(AVG(CP.usecounts * 1.0) as Decimal(12,2))[Avg_Use],
CAST(AVG(CASE WHEN CP.usecounts > 1 THEN (CP.usecounts * 1.0)
ELSE NULL END) as Decimal(12,2))[Avg_Multi_Use]
FROM sys.dm_exec_cached_plans as CP
GROUP BY CP.objtype
) AS S
ORDER BY S.CacheType
결과 :
" X MB가있는 경우 " 또는 " Ad Hoc의 X %가 일회용 인 경우 " 라고 말하지 않겠 습니다.
Sprocs, Triggers, Views 또는 Parameterized / Prepared SQL에는 영향을 미치지 않으며 Ad-Hoc 쿼리에만 영향을줍니다.
내 개인적인 권장 사항은 Prod Environment에서 켜는 것이지만 Dev Environment에서 끄는 것을 고려하십시오.
나는이 말을 단지 당신이 분 실행 이상 소요 쿼리를 최적화하는 경우, 당신은 당신이 그것을 캐시와 함께 갈 것입니다 얼마나 빨리 볼 수 있습니다 전에 3 번을 실행하지 않기 때문에, 개발을위한 - 모든 한 번만 편집하면 최상의 최적화 디자인을 찾을 수 있습니다.
하루 종일이 작업을 수행하지 않으면 업무에 방해가되지 않도록 DBA에 요청하십시오.