Sql-Server

“儲存過程呼叫/秒”計數器總是增加

  • October 27, 2016

我們已經使用服務代理實現了一些功能,並最近部署在生產環境中。我觀察到“儲存過程呼叫/秒”計數器總是在增加。但是,我可以看到其他計數器(例如 Tasks Running 等)是穩定的。為什麼儲存過程呼叫/秒不堅持一個範圍?

有幾種不同類型的性能計數器,其中五種由 SQL Server 使用(至少就sys.dm_os_performance_countersDMV 中的內容而言)。您可以通過以下查詢看到這一點:

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);

引用自:https://dba.stackexchange.com/questions/153381