SQL Compilations / giây là một số liệu tốt, nhưng chỉ khi được kết hợp với Yêu cầu hàng loạt / giây . Chính nó, các phần tổng hợp mỗi giây không thực sự cho bạn biết nhiều.
Bạn đang nhìn thấy 170. Nếu req lô mỗi giây chỉ là 200 (hơi phóng đại về hiệu quả) thì có, bạn cần phải đi xuống tận cùng của nguyên nhân (rất có thể là lạm dụng các kế hoạch truy vấn và sử dụng một lần). Nhưng nếu req lô mỗi giây của bạn đo được khoảng 5000 thì 170 tổng hợp mỗi giây không tệ chút nào. Đó là một quy tắc chung rằng Tổng hợp / giây phải ở mức 10% hoặc ít hơn tổng số Yêu cầu hàng loạt / giây .
Nếu bạn thực sự muốn đi sâu vào những gì đang được lưu trong bộ nhớ cache, hãy chạy truy vấn sau sử dụng DMV phù hợp:
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
Để có được tất cả các gói sử dụng một lần (tính):
;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
Để có được tỷ lệ số lượng gói sử dụng một lần bạn có so với tất cả các gói được lưu trong bộ nhớ cache:
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
Đối với thời lượng được ghi lại thông qua Dấu vết máy chủ SQL, nó không có sẵn cho các sự kiện Biên dịch lại. Sẽ không quá quan trọng để xem thời lượng hoặc nỗi đau mà việc biên soạn kế hoạch gây ra, vì bạn không thể làm gì nhiều cho tình huống từng trường hợp cụ thể. Giải pháp là cố gắng hạn chế biên dịch và biên dịch lại thông qua việc sử dụng lại kế hoạch (truy vấn tham số, thủ tục lưu trữ, v.v.).