Sql-Server
“儲存過程呼叫/秒”計數器總是增加
我們已經使用服務代理實現了一些功能,並最近部署在生產環境中。我觀察到“儲存過程呼叫/秒”計數器總是在增加。但是,我可以看到其他計數器(例如 Tasks Running 等)是穩定的。為什麼儲存過程呼叫/秒不堅持一個範圍?
有幾種不同類型的性能計數器,其中五種由 SQL Server 使用(至少就
sys.dm_os_performance_counters
DMV 中的內容而言)。您可以通過以下查詢看到這一點:SELECT DISTINCT [cntr_type] FROM sys.dm_os_performance_counters ORDER BY [cntr_type];
回報:
65792 272696576 537003264 1073874176 1073939712
這些值意味著:
65792
== PERF_COUNTER_LARGE_RAWCOUNT == “不需要計算的原始計數器值,代表一個樣本,它只是最後一個觀察到的值。”
272696576
== PERF_COUNTER_BULK_COUNT == “在採樣間隔的每一秒內完成的平均操作數。”1073874176
== PERF_AVERAGE_BULK == “在一次操作期間平均處理的項目數。此計數器類型顯示處理的項目(例如發送的字節數)與完成的操作數的比率,並且需要一個以 PERF_AVERAGE_BASE 為基礎的屬性計數器類型。”
1073939712
== PERF_LARGE_RAW_BASE == “在 PERF_RAW_FRACTION 的計算中找到基值”
537003264
== PERF_LARGE_RAW_FRACTION == “子集與其集合的比率以百分比表示。此計數器類型僅顯示目前百分比,而不是一段時間內的平均值。”您可以在以下部落格文章中找到更多資訊:解釋來自 sys.dm_os_performance_counters 的計數器值
SQLServer:Broker Activation類別中的儲存過程呼叫/秒計數器的類型為272696576(即“PERF_COUNTER_BULK_COUNT”)。這些值是累積的。您需要將一個值擷取到一個變數中,等待 N 秒(即),擷取第二個值,然後將值之間的差除以 N(即)。例如:
WAITFOR DELAY '00:00:30'; -- 30 seconds``SELECT (@var2 - @var1) / 30.0;
DECLARE @Sample1 BIGINT, @Sample2 BIGINT, @Time1 DATETIME, @Time2 DATETIME; SELECT @Sample1 = [cntr_value], @Time1 = GETDATE() FROM sys.dm_os_performance_counters WHERE [object_name] = N'SQLServer:Databases' -- SQLServer:Broker Activation AND [counter_name] = N'Transactions/sec' -- Stored Procedures Invoked/sec AND [instance_name] = N'_Total'; WAITFOR DELAY '00:00:30.000'; -- 30 second pause/sleep SELECT @Sample2 = [cntr_value], @Time2 = GETDATE() FROM sys.dm_os_performance_counters WHERE [object_name] = N'SQLServer:Databases' -- SQLServer:Broker Activation AND [counter_name] = N'Transactions/sec' -- Stored Procedures Invoked/sec AND [instance_name] = N'_Total'; SELECT (@Sample2 - @Sample1) AS [Difference], (DATEDIFF(MILLISECOND, @Time1, @Time2) / 1000.0) AS [Seconds], (@Sample2 - @Sample1) / (DATEDIFF(MILLISECOND, @Time1, @Time2) / 1000.0);