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

Written by masayuki.ozawa

11月 19th, 2014 at 1:30 pm

Posted in 未分類

Leave a Reply

*