SQL Compilations / วินาทีเป็นตัวชี้วัดที่ดี แต่เมื่อควบคู่ไปกับการจอง Batch / วินาที การรวบรวมต่อวินาทีไม่ได้บอกอะไรคุณมากนัก
คุณจะเห็น 170 ถ้าแบตช์ req ต่อวินาทีเป็นเพียง 200 (เล็กน้อยเกินจริงสำหรับผล) แล้วใช่คุณจะต้องลงไปที่ด้านล่างของสาเหตุ แต่ถ้าแบตช์ของคุณต้องใช้เวลาประมาณ 5,000 ต่อวินาทีการรวบรวม 170 ครั้งต่อวินาทีนั้นไม่เลวเลย มันเป็นกฎทั่วไปของหัวแม่มือที่Compilations / วินาทีควรจะอยู่ที่ 10% หรือน้อยกว่ารวมจอง Batch / วินาที
หากคุณต้องการเจาะลึกลงไปในสิ่งที่ถูกแคชให้รันเคียวรีต่อไปนี้ที่ใช้ 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 จะไม่สามารถใช้ได้สำหรับเหตุการณ์การคอมไพล์ใหม่ การเห็นระยะเวลาหรือความเจ็บปวดนั้นไม่สำคัญนักเมื่อมีการรวบรวมแผนเนื่องจากคุณไม่สามารถทำอะไรได้มากนักสำหรับสถานการณ์เป็นกรณี ๆ ไป การแก้ปัญหาคือพยายาม จำกัด การรวบรวมและการคอมไพล์ใหม่ผ่านการใช้งานซ้ำตามแผน (แบบสอบถามแบบใช้พารามิเตอร์, ขั้นตอนการจัดเก็บและอื่น ๆ )