SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

sys.dm_os_performance_counters の情報取得時の注意点

leave a comment

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

Share

Written by Masayuki.Ozawa

11月 19th, 2014 at 1:30 pm

Posted in 未分類

Leave a Reply