2017-06-20 91 views
-3

我需要执行的存储过程统计信息:逻辑读取,物理读取,持续时间,写入,行计数。或者,也许我们可以简化这一点。它足以拥有相同的会话数据。就像SET STATISTICS IO ON/OFF一样,但是,我需要将结果保存到表格中。所以,SET STATISTICS IO不是选项。 这里的任何知识?SQL Server(2012+)执行的过程统计信息

我希望是这样的:

EXEC [my_proc]; 

INSERT INTO [sp_exec_stats] 
([lreads], [preads], ..., [rcount]) 
VALUES(?, ?, ..., ?); 
+0

可能重复:https://dba.stackexchange.com/questions/16493/tracking-stored-procedure-usage –

+0

感谢downvotes,但它不是重复的。请进一步探讨这个问题。 – Juozas

+0

请提供一些示例输入,预期输出以及您尝试过的任何内容。这就是我觉得它是重复的原因。 –

回答

0

最后,我发现解决方案由我自己。感谢我的友好社区。

对于真正了解问题的同事。请使用此方法(整个测试脚本“选择”部分是穴):

CREATE PROCEDURE [my_dummy_sp] 
    @rowcount INT OUTPUT 
AS 
BEGIN 

    SELECT TOP 10 * FROM [sys].[objects]; 
    SET @rowcount = @@ROWCOUNT; 

    RETURN 0; 

END;  

GO 


DECLARE @sp_exec_stats TABLE 
(
    [rec_id]   BIGINT IDENTITY(1, 1) 
    ,[sp_name]   NVARCHAR(256) 
    ,[db_name]   NVARCHAR(256) 
    ,[sys_dt]   DATETIMEOFFSET(7) 
    ,[logical_reads] INT 
    ,[physical_reads] INT 
    ,[duration]   INT 
    ,[writes]   INT 
    ,[rowcount]   INT 
    ,[cpu_time]   INT 
); 

DECLARE @rowcount INT; 

EXECUTE [my_dummy_sp] 
    @rowcount = @rowcount OUTPUT; 

INSERT INTO @sp_exec_stats 
(
    [sp_name] 
    ,[db_name]   
    ,[sys_dt]   
    ,[logical_reads]  
    ,[physical_reads] 
    ,[duration]   
    ,[writes]   
    ,[rowcount] 
    ,[cpu_time]  
) 
SELECT TOP 1 
    [sp_name]   = 'my_dummy_sp' 
    ,[db_name]   = DB_NAME()  
    ,[sys_dt]   = [last_execution_time] 
    ,[logical_reads] = [last_logical_reads] 
    ,[physical_reads] = [last_physical_reads] 
    ,[duration]   = [last_elapsed_time] 
    ,[writes]   = [last_logical_writes] 
    ,[rowcount]   = @rowcount 
    ,[cpu_time]   = [last_worker_time]  
FROM 
    [sys].[dm_exec_procedure_stats] 
WHERE 
     [object_id]  = OBJECT_ID('my_dummy_sp')  
ORDER BY 
    [last_execution_time] DESC; 


DROP PROCEDURE [my_dummy_sp]; 
SELECT * FROM @sp_exec_stats;