ぺんぺん師匠が先日の 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) ことで % を算出することができますので、この辺も気を付けておくとよいかと。