Compilazioni SQL / sec è una buona metrica, ma solo se abbinato a Richieste batch / sec . Di per sé, le compilation al secondo non ti dicono molto.
Stai vedendo 170. Se il req in batch al secondo è solo 200 (un po 'esagerato per effetto), allora sì, è necessario arrivare al fondo della causa (molto probabilmente un uso eccessivo di query ad hoc e piani monouso). Ma se il tuo batch req al secondo misura circa 5000, 170 compilazioni al secondo non sono affatto male. È una regola empirica generale che le compilazioni / sec dovrebbero essere al 10% o inferiori alle richieste batch totali / sec .
Se vuoi davvero approfondire ciò che viene memorizzato nella cache, esegui la seguente query che utilizza i DMV appropriati:
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
Per ottenere tutti i piani monouso (un conteggio):
;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
Per ottenere un rapporto di quanti piani di conteggio monouso hai confrontato con tutti i piani memorizzati nella 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
Per quanto riguarda le durate acquisite tramite una traccia di SQL Server, non è disponibile per gli eventi Ricompila. Non è così significativo vedere la durata o il dolore che sta causando la compilazione del piano, poiché non c'è molto che puoi fare per una situazione caso per caso. La soluzione è tentare di limitare le compilazioni e le ricompilazioni mediante il riutilizzo del piano (query con parametri, procedure memorizzate, ecc.).