2015-02-07 120 views
0

要求:計數在執行過程

要計算的時間過程已經執行

從到目前爲止我所理解的數量,sys.dm_exec_procedure_stats可用於近似計數,但這只是自上次服務重新啓動以來。我發現這個link on this website相關,但我需要數量準確,並且不應該在服務重啓後刷新。

請問我有這方面的一些指示嗎?

Hack:我需要跟蹤的過程有一個select語句,因此會返回一些存儲在名爲Results的永久表中的行。我能想到的最簡單的解決方案是在Results表中創建一個列以跟蹤過程執行情況,在插入之前從該列中選擇最大值並向其添加一個以增加計數。這個解決方案對我來說似乎相當愚蠢,但是我能想到的最好。

+0

你可以修改SProc嗎? – Richard 2015-02-07 18:42:35

+0

@理查德:是的,我可以。 – Simran 2015-02-07 18:47:03

+0

當計劃從緩存中刪除時,dm_exec_procedure_stats中的數據消失得更快。 – 2015-02-07 18:48:40

回答

1

我認爲你可以創建一個序列對象,假設你使用的是SQL Server 2012或更新版本。

CREATE SEQUENCE ProcXXXCounter 
    AS int 
    START WITH 1 
    INCREMENT BY 1 ; 

然後在程序從取一個值:

declare @CallCount int 

select @CallCount = NEXT VALUE FOR ProcXXXCounter 

當然還有一個小的開銷,這一點,但不會導致類似阻塞問題可以使用表發生因爲序列是在事務之外處理的。

序列參數:https://msdn.microsoft.com/en-us/library/ff878091.aspx

+1

只有avilable在2012和更高版本,如果proc回滾了一個數字,那麼這個數字會被增加,並且會顯示錯誤的執行次數。 – 2015-02-07 19:11:18

+0

@JamesZ:非常感謝詹姆斯。這實際上看起來像我想要的。萬分感謝。 – Simran 2015-02-07 19:13:44

1

即使服務已重新啓動,我可以考慮跟蹤執行次數的唯一方法是在您的數據庫中有一個表,並在每次執行時在該過程中向該表中插入一行。

也許添加一個日期時間列以及收集更多關於執行的信息。以及執行等的用戶列。

+0

謝謝。是的,我上面提到的那種黑客有點相同,但實際上期待着這樣一個更整潔的方式:) – Simran 2015-02-07 19:10:09

+0

對我來說它似乎很整潔:)不認爲你有很多選擇與您的要求:) – 2015-02-07 19:12:15

1

這是可以做到,簡便和企業版,通過使用擴展事件。 sqlserver.module_end事件將觸發,正確設置謂詞並使用直方圖目標。

http://sqlperformance.com/2014/06/extended-events/predicate-order-matters https://technet.microsoft.com/en-us/library/ff878023(v=sql.110).aspx

要消耗的值,查詢直方圖靶(下審查目標輸出的例子)。

+0

感謝您的貢獻。 :)這看起來很有趣,但我是一個相當新手。對不起,作爲一個noob,但我可以請得到一個更基本的職位開始?謝謝。 – Simran 2015-02-08 16:06:03