0

我有一个使用 DMV 的存储过程,它返回一些关于存储过程的性能统计信息。在使用它作为查看 SP 性能的工具时,我发现我的一些最复杂的存储过程有多个缓存计划。有问题的存储过程有很多参数,并且它们的性能在它们的缓存计划中变化很大,因此,我想检查这些存储过程是如何被调用的。特别是具有值的参数(除了它们的默认值)。

有没有办法通过另一个 DMV 在结果集中调用存储过程命令?

例如,我希望能够看到类似:“Exec MyProcName @param1=value1, @param2=value2, @paramN=valueN”

我对这个主题的第二个问题是每个存储过程的缓存计划的多个实例。我的想法是,如果使用不同的参数值调用程序(足够的变化以实际更改或生成新计划),则可能会有多个计划。我是在轨道上还是远离基地?

这是我当前使用 sys.dm_exec_procedure_stats dmv 的存储过程的定义:

ALTER PROCEDURE [dbo].[bss_stored_procedure_performance]
@dt_start as datetime = null
,@dt_end as datetime = null
,@db_name as varchar(100) = null
,@sp_name as varchar(100) = null
,@sort_col as varchar(25) = 'Avg Physical Reads'
,@sort_asc as bit = 0
,@record as bit = 0 
AS
BEGIN

SET NOCOUNT ON;

if @dt_start is null
    begin
        set @dt_start = CURRENT_TIMESTAMP - 3
        set @dt_end = CURRENT_TIMESTAMP
    end


SELECT X.* FROM (
SELECT CASE WHEN database_id = 32767 then 'Resource' ELSE DB_NAME(database_id)END AS DBName
,OBJECT_SCHEMA_NAME(object_id,database_id) AS [Schema]  
,OBJECT_NAME(object_id,database_id)AS [Obj Name]
,type_desc as [Object Type]
,cached_time as [Cached dt]
,last_execution_time as [Last Execute dt]
,last_elapsed_time as [Last Duration]
,cast(last_elapsed_time*.000001 as decimal(9,2)) as [Last Duration / Seconds]
,execution_count as [Execution Count]
,total_worker_time / execution_count AS [Avg CPU]
,min_elapsed_time  AS [Min Duration]
,total_elapsed_time / execution_count AS [Avg Duration]
,max_elapsed_time AS [Max Duration]
,total_logical_reads / execution_count AS [Avg Logical Reads]
,total_logical_writes / execution_count AS [Avg Logical Writes]
,total_physical_reads  / execution_count AS [Avg Physical Reads]
FROM sys.dm_exec_procedure_stats  
where last_execution_time between @dt_start and @dt_end
and ((@db_name is null) or (DB_NAME(database_id) = @db_name))
and ((@sp_name is null) or (OBJECT_NAME(object_id,database_id) like '%' + @sp_name + '%'))
) X
ORDER BY
CASE WHEN @sort_col = 'Avg Physical Reads'
AND @sort_asc = 1
THEN [Avg Physical Reads] END ASC,
CASE WHEN @sort_col = 'Avg Physical Reads'
AND @sort_asc = 0
THEN [Avg Physical Reads] END DESC,
CASE WHEN @sort_col = 'Last Execute dt'
AND @sort_asc = 1
THEN [Last Execute dt] END ASC,
CASE WHEN @sort_col = 'Last Execute dt'
AND @sort_asc = 0
THEN [Last Execute dt] END DESC



print 'Date Range: ' + convert(varchar(50),@dt_start) + ' -- to -- ' +  convert(varchar(50),@dt_end)
4

0 回答 0