web-dev-qa-db-ja.com

DMVによって報告されるバッチ要求/秒は、アクティビティモニターよりも数百万倍も大きい

SQL Serverプロファイラーを使用して、SSMSアクティビティモニターで確認されているように、1秒あたりのリクエストが約30リクエスト/秒であることを確認しましたが、sys.dm_os_performance_countersは数億/秒を報告しています。

この全体的な不一致を引き起こしている可能性のあるアイデアはありますか?

クエリ:

SELECT
    RTrim(LTrim(object_name)) as object_name,
    RTrim(LTrim(counter_name)) as counter_name,
    cntr_value
FROM
    sys.dm_os_performance_counters 
WHERE 
    instance_name IN ('', '_Total')
    and counter_name IN (
        N'Batch Requests/sec'
        , N'SQL Compilations/sec'
        , N'SQL Re-Compilations/sec'
        , N'Transactions/sec')

結果:

object_name counter_name    cntr_value
SQLServer:Databases Transactions/sec    191721399
SQLServer:SQL Statistics    Batch Requests/sec  242955426
SQLServer:SQL Statistics    SQL Compilations/sec    42048371
SQLServer:SQL Statistics    SQL Re-Compilations/sec 1200947
4
NTDLS

ドキュメント から:

注:秒単位のカウンターの場合、この値は累積されます。レート値は、離散時間間隔で値をサンプリングして計算する必要があります。 2つの連続するサンプル値の差は、使用される時間間隔のレートに等しくなります。

すでにインターバルサンプリングを行っているものをご希望の場合は、 sp_BlitzFirst はかなりきちんとしていて、無料で完全に開示されています。私は貢献者などです。

12
Erik Darling
DECLARE @DATEDEMARRAGE datetime

SELECT @DATEDEMARRAGE = create_date FROM sys.databases
WHERE name ='tempdb'

SELECT cntr_value / datediff (second,@DATEDEMARRAGE,getdate()) as [Batch Requests/sec]
FROM sys.dm_os_performance_counters
WHERE counter_name  like '%Batch Requests/se%'
1
user151389

私はstackoverflowからこれの一部を見つけたかもしれませんが、これにはsys.dm_os_sys_infoからselect sqlserver_start_timeを使用したいです。 sys.dm_os_performance_countersのデータの多くは累積的です。より静かなサーバーでは、10進数のデータ型に変換する必要がある場合があります。

さまざまなパフォーマンス指標について、以下のクエリのバージョンがいくつかあります。

 with perf_data as
(
select @@servername as Server_name, instance_name as Database_Name, 
counter_name,  cntr_value as Total_Tran_Since_Startup
,SQL_Start_Time = (select sqlserver_start_time from sys.dm_os_sys_info)
--,Time_now = getdate()
--,Diff_Seconds = (SELECT DATEDIFF(ss, (select sqlserver_start_time from 
sys.dm_os_sys_info), getdate()))
,Tran_per_Second = (cast(cntr_value as decimal)/(SELECT DATEDIFF(ss, (select 
sqlserver_start_time from sys.dm_os_sys_info), getdate())))
from sys.dm_os_performance_counters
where counter_name in ('Transactions/sec', 'Redone Bytes/sec')
and instance_name not in ('master', 'msdb', 'model', 'mssqlsystemresource', 
'TESTAG', '_Total', 'TESTTG'                                                                                                                         
,'targettest')
--group by instance_name, counter_name, cntr_value
--and Server_name in ('server1', 'server2','server3')
--order by counter_name, instance_name)
)
select * from perf_data
--where Server_name in ('server1', 'server2','server3', 'server4' )
order by counter_name, tran_per_second desc
1
Alen