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
ドキュメント から:
注:秒単位のカウンターの場合、この値は累積されます。レート値は、離散時間間隔で値をサンプリングして計算する必要があります。 2つの連続するサンプル値の差は、使用される時間間隔のレートに等しくなります。
すでにインターバルサンプリングを行っているものをご希望の場合は、 sp_BlitzFirst はかなりきちんとしていて、無料で完全に開示されています。私は貢献者などです。
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%'
私は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