Compilações SQL / s é uma boa métrica, mas somente quando associado a Solicitações em lote / s . Por si só, compilações por segundo realmente não dizem muito.
Você está vendo 170. Se a quantidade de solicitações em lote por segundo for de apenas 200 (um pouco exagerado para o efeito), então sim, você precisará se aprofundar na causa (provavelmente um uso excessivo de consultas ad hoc e planos de uso único). Mas se o número de solicitações em lote por segundo estiver medindo cerca de 5000, então 170 compilações por segundo não serão ruins. É uma regra geral prática que as compilações / s devem ser de 10% ou menos do que o total de solicitações em lote / s .
Se você realmente deseja detalhar o que está sendo armazenado em cache, execute a seguinte consulta que utiliza as DMVs apropriadas:
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
Para obter todos os planos de uso único (uma contagem):
;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
Para obter uma proporção de quantos planos de contagem de uso único você comparou a todos os planos em cache:
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
Quanto às durações capturadas por meio de um rastreamento do SQL Server, ele não está disponível para os eventos Recompilar. Não é tão significativo ver a duração ou a dor que a compilação do plano está causando, pois não há muito o que fazer em uma situação caso a caso. A solução é tentar limitar compilações e recompilações através da reutilização do plano (consultas parametrizadas, procedimentos armazenados, etc.).