SQL Compilations / Sek. Ist eine gute Metrik, jedoch nur in Verbindung mit Batch Requests / Sek . Zusammenstellungen pro Sekunde sagen an sich nicht viel aus.
Sie sehen 170. Wenn der Batch-Bedarf pro Sekunde nur 200 beträgt (ein wenig übertrieben), müssen Sie der Ursache auf den Grund gehen (höchstwahrscheinlich ein übermäßiger Einsatz von Ad-hoc-Abfragen und Einwegplänen). Wenn Ihre Stapelanforderung pro Sekunde jedoch ungefähr 5000 beträgt, sind 170 Zusammenstellungen pro Sekunde überhaupt nicht schlecht. Es ist eine allgemeine Faustregel, dass die Compilations / Sek. 10% oder weniger als die gesamten Batch Requests / Sek . Betragen sollten .
Wenn Sie wirklich einen Drilldown durchführen möchten, was gerade zwischengespeichert wird, führen Sie die folgende Abfrage aus, bei der die entsprechenden DMVs verwendet werden:
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
So erhalten Sie alle Einwegpläne (Zählung):
;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
So ermitteln Sie das Verhältnis der Anzahl der von Ihnen verwendeten Single-Use-Pläne zu allen zwischengespeicherten Plänen:
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
Die Dauer, die über eine SQL Server-Ablaufverfolgung erfasst wird, steht für die Neukompilierungsereignisse nicht zur Verfügung. Es ist nicht so wichtig, die Dauer oder den Schmerz zu sehen, den die Kompilierung des Plans verursacht, da Sie im Einzelfall nicht viel tun können. Die Lösung besteht darin, zu versuchen, Kompilierungen und Neukompilierungen durch die Wiederverwendung von Plänen (parametrisierte Abfragen, gespeicherte Prozeduren usw.) einzuschränken.