Kompilacje SQL / s to dobra miara, ale tylko w połączeniu z żądaniami wsadowymi / s . Same kompilacje na sekundę tak naprawdę niewiele mówią.
Widzisz 170. Jeśli zapotrzebowanie na partię na sekundę wynosi tylko 200 (nieco przesadzone ze względu na efekt), to tak, musisz przejść do sedna przyczyny (najprawdopodobniej nadużywanie zapytań ad hoc i planów jednorazowego użytku). Ale jeśli twoje zapotrzebowanie na partię wynosi około 5000, to 170 kompilacji na sekundę wcale nie jest złe. Ogólna zasada jest taka, że liczba kompilacji na sekundę powinna wynosić 10% lub mniej niż łączna liczba żądań partii na sekundę .
Jeśli naprawdę chcesz dokładnie zbadać, co jest buforowane, uruchom następujące zapytanie, które wykorzystuje odpowiednie DMV:
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
Aby uzyskać wszystkie plany jednorazowego użytku (liczba):
;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
Aby uzyskać stosunek liczby planów jednorazowego użytku do wszystkich planów buforowanych:
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
Jeśli chodzi o czasy trwania przechwycone przez śledzenie programu SQL Server, nie jest ono dostępne dla zdarzeń ponownej kompilacji. Nie jest tak istotne, aby zobaczyć czas trwania lub ból, który powoduje kompilacja planu, ponieważ niewiele można zrobić w przypadku poszczególnych przypadków. Rozwiązaniem jest próba ograniczenia kompilacji i ponownych kompilacji poprzez ponowne użycie planu (sparametryzowane zapytania, procedury składowane itp.).