Компиляции SQL / сек - хороший показатель, но только в сочетании с пакетными запросами / сек . Само по себе количество компиляций в секунду мало что говорит.
Вы видите 170. Если пакетное требование в секунду составляет всего 200 (немного преувеличено для эффекта), тогда да, вам нужно приступить к сути (наиболее вероятно чрезмерное использование специальных запросов и одноразовых планов). Но если ваш пакетный запрос в секунду измеряет около 5000, то 170 сборок в секунду совсем не плохо. Общее практическое правило заключается в том, что количество компиляций / сек должно составлять 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, она недоступна для событий перекомпиляции. Не так важно видеть продолжительность или боль, которую вызывает компиляция плана, так как вы мало что можете сделать для конкретной ситуации. Решение состоит в том, чтобы попытаться ограничить компиляции и перекомпиляции посредством повторного использования плана (параметризованные запросы, хранимые процедуры и т. Д.).