查找存儲過程的執行頻率和時間

由於公司最近的數據庫服務器CPU非常不穩定。

wKioL1brtJnTPHFYAAA6lHonNxU307.png

於是乎下手查找問題的來源。想了下,只能從存儲過程的執行狀態中下手。

查了下資料,發現MSSQL中的系統表sys.dm_exec_procedure_stats會記錄存儲過程的執行狀態數據。字段含義就不累述了。開始幹活:

1、將數據插入一張新表記錄

select convert(nvarchar(10),getdate(),121) as countdate,d.* into procedure_stats_daily 
from SYS.procedures S JOIN sys.dm_exec_procedure_stats D  ON S.object_id=D.object_id


2、每天作業執行,將數據插入記錄表

insert into procedure_stats_daily
select convert(nvarchar(10),getdate(),121),d.*
from SYS.procedures S JOIN SYS.dm_exec_procedure_stats D  ON S.object_id=D.object_id


3、查看時間@Date的執行情況

CREATE PROC CS_RO_Base_GetDailyProcedureStats
@Date datetime=''
AS
BEGIN
    DECLARE @Date1 datetime
    SET @Date1=@Date+1
    SELECT a.object_id,c.name as '存儲過程名稱',
    CASE WHEN a.cached_time>=@Date THEN ISNULL(a.execution_count,0) ELSE ISNULL(a.execution_count-b.execution_count,0)END as '執行次數',
    CASE WHEN a.cached_time>=@Date THEN ISNULL(a.total_worker_time/1000000,0)ELSE ISNULL((a.total_worker_time-b.total_worker_time)/1000000,0)END as '執行時間/秒',
    CASE WHEN a.cached_time>=@Date THEN convert(numeric(18,4),(ISNULL(a.total_worker_time,0)))/ISNULL(a.execution_count,0)/1000000 
    WHEN ISNULL(a.execution_count-b.execution_count,0)=0 THEN 0.00 
    ELSE convert(numeric(18,4),(a.total_worker_time-b.total_worker_time))/(a.execution_count-b.execution_count)/1000000 end as '平均執行時間/秒' 
    FROM
    (
    select object_id,cached_time,plan_handle,isnull(execution_count,0) as execution_count,isnull(total_worker_time,0)as total_worker_time 
    from procedure_stats_daily where countdate=@Date1
    )a
    FULL JOIN 
    (
    select object_id,cached_time,plan_handle,isnull(execution_count,0) as execution_count,isnull(total_worker_time,0)as total_worker_time 
    from procedure_stats_daily where countdate=@Date
    )b on a.plan_handle=b.plan_handle
    left join sys.objects c on a.object_id=c.object_id
    order by CASE WHEN a.cached_time>=@Date THEN ISNULL(a.execution_count,0) ELSE ISNULL(a.execution_count-b.execution_count,0)END desc
END


 

根據以上的數據,我們可以查出最頻繁的存儲過程和效率最低的存儲過程,進而給我們的優化工作提供了方向。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章