2017-05-13 67 views
0

我有一个执行不同的存储过程,并通过调用但每次另一个存储过程AuditLogProcDetails记录的StartTime和不同的存储过程执行的EndTime这个AuditLogProc存储过程如下面的代码:SQL Server代码优化

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dba].[AuditLogProc] 
    @Id AS INT, 
    @ProcessId AS INT 
AS 
BEGIN 
    TRY 
     SELECT @StartTime = GETDATE(); 

     EXEC AppPopTimeInc @Id, @ProcessId; 

     BEGIN 
      EXEC [dba].[AuditLogProcDetails] @Id, @ProcessId, 'Exiting AppPopTimeInc', @StartTime, GETDATE() 
     END 

     SELECT @StartTime = GETDATE(); 

     EXEC AppPopTimeIncDetails @Id, @ProcessId; 

     BEGIN 
      EXEC [dba].[AuditLogProcDetails] @Id, @ProcessId, 'Exiting AppPopTimeIncDetails', @StartTime, GETDATE() 
     END 

     SELECT @StartTime = GETDATE(); 

     EXEC AppObsResultsAggInc @Id, @ProcessId; 

     BEGIN 
      EXEC [dba].[AuditLogProcDetails] @Id, @ProcessId, 'Exiting AppObsResultsAggInc', @StartTime, GETDATE() 
     END 

     SELECT @StartTime = GETDATE(); 

     EXEC AppPricedDetailsInc @Id, @ProcessId; 

     BEGIN 
      EXEC [dba].[AuditLogProcDetails] @Id, @ProcessId, 'Exiting AppPricedDetailsInc', @StartTime, GETDATE() 
     END 

     SELECT @StartTime = GETDATE(); 

     EXEC AppPricedDetailsIncDetails @Id, @ProcessId; 

     BEGIN 
      EXEC [dba].[AuditLogProcDetails] @Id, @ProcessId, 'Exiting AppPricedDetailsIncDetails', @StartTime, GETDATE() 
     END 

     SELECT @StartTime = GETDATE(); 

     EXEC AppLoggedData @Id, @ProcessId; 

     BEGIN 
      EXEC [dba].[AuditLogProcDetails] @Id, @ProcessId, 'Exiting AppLoggedData', @StartTime, GETDATE() 
     END 

    END TRY 
    BEGIN CATCH 
     DECLARE @ErrorMessage NVARCHAR(4000); 
     DECLARE @ErrorState INT; 

     SELECT 
      @ErrorMessage = error_message(), 
      @errorState = error_state(); 

     RAISERROR (@ErrorMessage, @ErrorState); 
    END CATCH 

    RETURN 

我的问题是:

  1. 这是叫个最好的办法每一次在不同的存储过程被调用后,每次都调用相同的过程AuditLogProcDetails,即包括BEGINEND块?

  2. 由于AuditLogProcDetails过程被多次调用,我怎样才能更好地重构它?

回答

1

对我来说,它似乎你想跟踪你的执行时间统计。要做到这一点,我可以向你推荐更好的方法: 如果你使用sys.dm_exec_procedure_stats而不是那个,你将不仅获得执行时间,而且获得有关数据库的其他统计数据的整个分支。使用此方法只有一个缺点:

它显示缓存中存储过程的统计信息。为了消除这个缺点,您可以创建一分钟的作业来存储该视图的当前结果。 稍后,当您想要检查查询的运行时间时,可以从存储结果的表中进行选择。

通过这种方式,您不仅可以获得关于存储过程的一些统计信息,还可以获得历史数据,显示哪些过程成为瓶颈,您将不仅可以检查执行时间,还可以检查IO统计信息和其他超酷东西也是。

+0

这有帮助,谢谢 – ronan