web-dev-qa-db-fra.com

Demandes de lots / SEC rapportées par DMV des millions de fois plus grande que l'ensemble de l'activité

J'ai vérifié via SQL Server Profiler que ma demande par seconde est d'environ 30 demandes/s, comme en corroborée par le moniteur d'activité SSMS mais sys.dm_os_performance_counters signale des centaines de millions/s.

Une idée de ce qui pourrait causer cette divergence brute?

Mettre en doute:

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')

Résultats:

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

Du Documentation :

Remarque: pour les compteurs par seconde, cette valeur est cumulative. La valeur de la vitesse doit être calculée en échantillonnant la valeur à des intervalles de temps discrets. La différence entre deux valeurs d'échantillon successives est égale à la vitesse de l'intervalle de temps utilisé.

Si vous souhaitez quelque chose qui fait déjà un échantillonnage d'intervalles, sp_blitzfirst est assez soigné et libre, et une divulgation complète: je suis un contributeur, etc.

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

J'ai peut-être trouvé une partie de ceci à partir de Stackoverflow, mais j'aime utiliser Sélectionnez SQLSERVER_START_TIME à partir de SYS.DM_OS_SYS_INFO pour cela. Beaucoup de données dans sys.dm_os_performance_counters sont cumulatives. Pour les serveurs plus silencieux, vous devrez peut-être convertir en types de données décimales.

J'ai plusieurs versions de la requête ci-dessous pour différentes métriques PERF.

 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