2017-05-13 63 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