SQL Compilations / sec 는 좋은 지표이지만 Batch Requests / sec 와 결합 된 경우에만 가능 합니다. 자체적으로 초당 컴파일은 실제로 많은 것을 말하지는 않습니다.
초 당 배치 요청이 200에 불과한 경우 (효과적으로 약간 과장된 경우), 원인의 맨 아래로 내려 가야합니다 (대부분의 임시 쿼리 및 단일 사용 계획의 초과 사용). 그러나 초당 배치 요구가 약 5000을 측정하면 초당 170 컴파일이 나쁘지 않습니다. 일반적으로 Compilations / sec 가 총 Batch Requests / sec 보다 10 % 이하 여야합니다 .
실제로 캐시되는 내용을 자세히 보려면 적절한 DMV를 사용하는 다음 쿼리를 실행하십시오.
select
db_name(st.dbid) as database_name,
cp.bucketid,
cp.usecounts,
cp.size_in_bytes,
cp.objtype,
st.text
from sys.dm_exec_cached_plans cp
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
모든 일회용 계획을 세려면 (횟수) :
;with PlanCacheCte as
(
select
db_name(st.dbid) as database_name,
cp.bucketid,
cp.usecounts,
cp.size_in_bytes,
cp.objtype,
st.text
from sys.dm_exec_cached_plans cp
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
)
select count(*)
from PlanCacheCte
where usecounts = 1
모든 캐시 된 계획과 비교 한 단일 사용 횟수 계획의 비율을 얻으려면 다음을 수행하십시오.
declare @single_use_counts int, @multi_use_counts int
;with PlanCacheCte as
(
select
db_name(st.dbid) as database_name,
cp.bucketid,
cp.usecounts,
cp.size_in_bytes,
cp.objtype,
st.text
from sys.dm_exec_cached_plans cp
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
where cp.cacheobjtype = 'Compiled Plan'
)
select @single_use_counts = count(*)
from PlanCacheCte
where usecounts = 1
;with PlanCacheCte as
(
select
db_name(st.dbid) as database_name,
cp.bucketid,
cp.usecounts,
cp.size_in_bytes,
cp.objtype,
st.text
from sys.dm_exec_cached_plans cp
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
where cp.cacheobjtype = 'Compiled Plan'
)
select @multi_use_counts = count(*)
from PlanCacheCte
where usecounts > 1
select
@single_use_counts as single_use_counts,
@multi_use_counts as multi_use_counts,
@single_use_counts * 1.0 / (@single_use_counts + @multi_use_counts) * 100
as percent_single_use_counts
SQL Server 추적을 통해 캡처 된 기간은 재 컴파일 이벤트에 사용할 수 없습니다. 경우에 따라 할 수있는 일이 많지 않기 때문에 계획 컴파일이 발생하는 기간이나 고통을 보는 것은 그리 중요하지 않습니다. 해결책은 계획 재사용 (매개 변수화 된 쿼리, 저장 프로 시저 등)을 통해 컴파일 및 재 컴파일을 제한하는 것입니다.