Компіляції SQL / сек - це хороший показник, але лише в поєднанні з пакетними запитами / сек . Самі по собі компіляції за секунду насправді мало що розповідають вам.
Ви бачите 170. Якщо пакетна кількість запитів на секунду становить лише 200 (трохи перебільшено за ефектом), то так, вам потрібно зійти донизу причини (швидше за все, надмірне використання спеціальних запитів та планів одноразового використання). Але якщо ваш пакетний запит на секунду вимірює близько 5000, то 170 компіляцій за секунду зовсім не погано. Загальним правилом є те, що компіляції / сек повинні становити 10% або менше загальних пакетних запитів / сек .
Якщо ви дійсно хочете переглянути деталі кешованого запиту, запустіть наступний запит, який використовує відповідні 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
Щоб отримати всі плани одноразового використання (кількість):
;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
Щоб отримати співвідношення кількості планів для одноразового використання у порівнянні з усіма кешованими планами:
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
Що стосується тривалості, захопленої через трасування SQL Server, вона не доступна для подій перекомпіляції. Це не так важливо, щоб побачити тривалість або біль, що викликає складання плану, так як для ситуації в кожному конкретному випадку ви не можете багато чого зробити. Рішення полягає в спробі обмежити компіляції та рекомпіляції шляхом повторного використання плану (параметризовані запити, збережені процедури тощо).