ぺんぺん師匠が先日の db tech showcase 2014 東京でお話しされていた内容になりますが、sys.dm_os_performance_counters の情報で /sec 系については情報の取得に注意点がありますのでメモとして。
# WMI で取得した場合も同様かと。
sys.dm_os_performance_counters のヘルプに記載されているのですが、
1 秒単位のカウンターの場合、この値は累積値になります。? レート値は、連続しない間隔で値をサンプリングして算出する必要があります。 2 つの連続するサンプル値の間隔は、使用される間隔のレートと同じです。
となっています。
1 秒単位のカウンターについては、以下のようなクエリで確認をすることができます。
select * from sys.dm_os_performance_counters where cntr_type = 272696576
cntr_type = 272696576 は PERF_COUNTER_BULK_COUNT となるようですね。
この cntr_type が使用されている項目については 2 点で情報を取得して、差を出すことにより値を算出する必要があります。
以下のようなクエリを実行することで、秒間のバッチ実行数が算出できるかと。
DECLARE @cntr_value bigint
SELECT @cntr_value = cntr_value FROM sys.dm_os_performance_counters
WHERE cntr_type = 272696576 AND counter_name LIKE 'Batch Requests/sec%'
WAITFOR DELAY '00:00:01'
SELECT cntr_value - @cntr_value FROM sys.dm_os_performance_counters
WHERE cntr_type = 272696576 AND counter_name LIKE 'Batch Requests/sec%'
GO 100
または、
IF OBJECT_ID('tempdb..#BeforeInfo') IS NOT NULL
DROP TABLE #BeforeInfo
SELECT GETDATE() AS B_Date, object_name, counter_name, cntr_value AS B_cntr_value INTO #BeforeInfo
FROM sys.dm_os_performance_counters where counter_name = 'Batch Requests/sec'
WAITFOR DELAY '00:00:01'
SELECT
dpc.object_name,
dpc.counter_name,
cntr_value,
B_cntr_value,
(dpc.cntr_value- B_cntr_value) / DATEDIFF(s, B_Date, GETDATE()) AS cntr_value_diff
FROM sys.dm_os_performance_counters dpc
LEFT JOIN #BeforeInfo b
ON
b.object_name = dpc.object_name
AND
b.counter_name = dpc.counter_name
WHERE dpc.counter_name IN('Batch Requests/sec', 'User Connections')
DROP TABLE #BeforeInfo
ratio (cntr_type = 537003264) についてもついになる ratio base (cntr_type = 1073939712) で割る (ratio / ratio base) ことで % を算出することができますので、この辺も気を付けておくとよいかと。