SQL Derlemeleri / sn iyi bir metriktir, ancak yalnızca Toplu İstekler / sn ile birleştiğinde . Kendi başına, saniye başına derlemeler size çok fazla şey anlatmaz.
170 görüyorsunuz. Saniyede toplu iş gereksinimi sadece 200 ise (etki için biraz abartılıysa), evet, nedenin sonuna inmeniz gerekir (büyük olasılıkla geçici sorgulamanın ve tek kullanımlık planların aşırı kullanımı). Ancak saniyede toplu iş gereksinimi yaklaşık 5000 ise, saniyede 170 derleme hiç de fena değil. Derlemeler / sn'nin toplam Toplu İstek / sn'den % 10 veya daha az olması genel bir kuraldır .
Önbelleğe alınan öğeyi ayrıntılı olarak incelemek istiyorsanız, uygun DMV'leri kullanan aşağıdaki sorguyu çalıştırın:
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
Tüm tek kullanımlık planları (bir sayı) almak için:
;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
Önbelleğe alınan tüm planlarla karşılaştırıldığında kaç tane tek kullanımlık sayım planınızın oranına sahip olmak için:
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
Bir SQL Server izleme yoluyla yakalanan sürelere gelince, Recompile olayları için kullanılamaz. Durumun derlenmesinin neden olduğu süreyi veya ağrıyı görmek o kadar önemli değildir, çünkü tek tek durum için yapabileceğiniz çok şey yoktur. Çözüm, plan yeniden kullanımı (parametreleştirilmiş sorgular, saklı yordamlar, vb.) Yoluyla derlemeleri ve yeniden derlemeleri sınırlamaya çalışmaktır.