SQL Compilations / sec es una buena métrica, pero solo cuando se combina con Batch Requests / sec . Por sí solo, las compilaciones por segundo realmente no te dicen mucho.
Está viendo 170. Si la solicitud de lote por segundo es solo 200 (un poco exagerado para el efecto), entonces sí, debe llegar al fondo de la causa (probablemente un uso excesivo de consultas ad hoc y planes de un solo uso). Pero si su requerimiento de lote por segundo mide aproximadamente 5000, entonces 170 compilaciones por segundo no son malas en absoluto. Es una regla general que las compilaciones / seg deben estar al 10% o menos que el total de solicitudes de lote / seg .
Si realmente desea profundizar en lo que se está almacenando en caché, ejecute la siguiente consulta que utiliza los DMV apropiados:
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 obtener todos los planes de un solo uso (un recuento):
;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 obtener una proporción de cuántos planes de recuento de un solo uso tiene en comparación con todos los planes en caché:
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
En cuanto a las duraciones capturadas a través de un seguimiento de SQL Server, no está disponible para los eventos de recompilación. No es tan significativo ver la duración o el dolor que está causando la compilación del plan, ya que no hay mucho que pueda hacer para una situación caso por caso. La solución es intentar limitar las compilaciones y recompilaciones mediante la reutilización del plan (consultas parametrizadas, procedimientos almacenados, etc.).