oll*_*lle 10 performance monitoring sql-server
为了诊断一些性能问题,我想更好地了解与系统性能相比调用某些过程的次数。有没有办法获得在特定时间跨度内每个过程被调用的次数?
Mar*_*ith 17
您可以从动态管理视图(DMV)获得此(以及更多)。要获取特定存储过程的统计信息,请尝试以下查询。
SELECT
OBJECT_NAME(qt.objectid)
, qs.execution_count AS [Execution Count]
, qs.execution_count / DATEDIFF(Second, qs.creation_time, GETDATE()) AS [Calls/Second]
, qs.total_worker_time / qs.execution_count AS [AvgWorkerTime]
, qs.total_worker_time AS [TotalWorkerTime]
, qs.total_elapsed_time / qs.execution_count AS [AvgElapsedTime]
, qs.max_logical_reads
, qs.max_logical_writes
, qs.total_physical_reads
, DATEDIFF(Minute, qs.creation_time, GETDATE()) AS [Age in Cache]
FROM
sys.dm_exec_query_stats AS qs
CROSS APPLY
sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
WHERE
qt.[dbid] = DB_ID()
AND qt.objectid = OBJECT_ID('StoredProcedureName')
OPTION (RECOMPILE);
Run Code Online (Sandbox Code Playgroud)
查看最常执行的程序:
SELECT
OBJECT_NAME(qt.objectid)
, qs.execution_count AS [Execution Count]
, qs.execution_count / DATEDIFF(Second, qs.creation_time, GETDATE()) AS [Calls/Second]
, qs.total_worker_time / qs.execution_count AS [AvgWorkerTime]
, qs.total_worker_time AS [TotalWorkerTime]
, qs.total_elapsed_time / qs.execution_count AS [AvgElapsedTime]
, qs.max_logical_reads
, qs.max_logical_writes
, qs.total_physical_reads
, DATEDIFF(Minute, qs.creation_time, GETDATE()) AS [Age in Cache]
FROM
sys.dm_exec_query_stats AS qs
CROSS APPLY
sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
WHERE
qt.[dbid] = DB_ID()
ORDER BY
qs.execution_count DESC
OPTION (RECOMPILE);
Run Code Online (Sandbox Code Playgroud)
报告的值是自上次重新启动以来的累积值。如果要在固定时间段内进行测量,请使用以下命令重置等待统计信息。
DBCC SQLPERF("sys.dm_os_wait_stats",CLEAR);
Run Code Online (Sandbox Code Playgroud)
如果您想测量一天中的固定时间跨度,您可以通过代理作业将查询输出提供给表,并且 a) 计算两次运行之间的值或 b) 将等待统计重置为代理作业的最后一步.
或者,捕获分析器跟踪并通过Clear Trace运行它。