Kompilasi SQL / detik adalah metrik yang baik, tetapi hanya jika digabungkan dengan Permintaan Batch / detik . Dengan sendirinya, kompilasi per detik tidak terlalu banyak memberi tahu Anda.
Anda melihat 170. Jika jumlah batch per detik hanya 200 (sedikit berlebihan untuk efeknya) maka ya, Anda harus turun ke bagian bawah penyebabnya (kemungkinan besar permintaan yang terlalu sering digunakan untuk permintaan ad hoc dan paket sekali pakai). Tetapi jika batch req Anda per detik berukuran sekitar 5000, maka 170 kompilasi per detik sama sekali tidak buruk. Ini adalah aturan umum bahwa Kompilasi / detik harus 10% atau kurang dari total Permintaan Batch / detik .
Jika Anda benar-benar ingin menelusuri apa yang sedang di-cache, jalankan kueri berikut yang menggunakan DMV yang sesuai:
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
Untuk mendapatkan semua paket sekali pakai (hitungan):
;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
Untuk mendapatkan rasio jumlah rencana penghitungan sekali pakai yang Anda bandingkan dengan semua paket dalam tembolok:
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
Adapun durasi yang ditangkap melalui Jejak SQL Server, itu tidak tersedia untuk acara Kompilasi. Tidak terlalu signifikan untuk melihat durasi atau rasa sakit yang disebabkan oleh kompilasi rencana, karena tidak banyak yang dapat Anda lakukan untuk situasi kasus per kasus. Solusinya adalah dengan mencoba membatasi kompilasi dan rekompilasi melalui rencana penggunaan ulang (pertanyaan parameter, prosedur tersimpan, dll.).