0

ストアド プロシージャのパフォーマンス統計を返す DMV を使用するストアド プロシージャがあります。これをツールとして使用して SP のパフォーマンスを調べたところ、最も複雑なストアド プロシージャの一部に複数のキャッシュされたプランがあることがわかりました。問題のストアド プロシージャには多くのパラメーターがあり、それらのパフォーマンスはキャッシュされたプランによって劇的に異なるため、これらのストアド プロシージャがどのように呼び出されているかを調べたいと思います。具体的には、値を持つパラメーター (デフォルト以外)。

別の DMV を介して結果セットで呼び出されるストアド プロシージャ コマンドを取得する方法はありますか?

たとえば、「Exec MyProcName @param1=value1, @param2=value2, @paramN=valueN」のようなものを見たいと思っています。

このテーマに関する 2 番目の質問は、ストアド プロシージャごとにキャッシュされたプランの複数のインスタンスについてです。私の考えでは、プロシージャーがさまざまなパラメーター値 (実際に変更または新しいプランを生成するのに十分なバリエーション) で呼び出された場合、複数のプランが存在する可能性があります。私はここで軌道に乗っていますか、それとも基地から離れていますか?

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