Hi,
Below calculation (in SQL) formula is in BOLD does not produce the same average seconds/read as the Windows Performance Monitor. Both were set to the same sampling interval.
Performance monitor reports 0.330. Below SQL code reports 0.
Any assistance would be appreciated.
Thanks in advance.
AvgDisksecPerRead is a 805438464 counter type.
((N1 - N0) / F) / (D1 - D0), where the numerator (N) represents the number of ticks counted during the last sample interval, F represents the frequency of the ticks, and the denominator (D) represents the number of operations completed during the last sample interval.
Below SQL can be run in SSMS:
DECLARE @WmiSl int, @WmiS int, @CO int, @Counter varchar(255),
@res decimal(30,3), @timeDelta decimal(30,3), @readsDelta decimal(30,3),
@AvgDisksecPerReadnvarchar(30),@AvgDisksecPerRead_Basenvarchar(30),
@TimeStamp_Sys100NSnvarchar(30),@Frequency_Perftimenvarchar(30),@TimeStamp_PerfTime nvarchar(30),
@AvgDisksecPerRead2nvarchar(30),@AvgDisksecPerRead_Base2nvarchar(30),
@TimeStamp_Sys100NS2nvarchar(30),@Frequency_Perftime2nvarchar(30),@TimeStamp_PerfTime2 nvarchar(30)
SET @Counter = 'Win32_PerfRawData_PerfDisk_LogicalDisk.Name=''C:'''
SET @TimeStamp_PerfTime2 = '0'
WHILE (1!=0)
BEGIN
EXEC [sys].[sp_OACreate] 'WbemScripting.SWbemLocator', @WmiSl OUTPUT, 5
EXEC [sys].[sp_OAMethod] @WmiSl, 'ConnectServer', @WmiS OUTPUT, '.', 'root\cimv2'
IF ISNULL(@WmiS, -1) <= 0
BEGIN
EXEC [sys].[sp_OADestroy] @WmiSl
RAISERROR('ERROR, could not access the WMI service.', 16, 1)
RETURN
END
EXEC [sys].[sp_OAMethod] @WmiS, 'Get', @CO OUTPUT, @Counter
EXEC [sys].[sp_OAGetProperty] @CO, 'AvgDisksecPerRead', @AvgDisksecPerReadOUTPUT
EXEC [sys].[sp_OAGetProperty] @CO, 'AvgDisksecPerRead_Base',@AvgDisksecPerRead_BaseOUTPUT
EXEC [sys].[sp_OAGetProperty] @CO, 'TimeStamp_Sys100NS',@TimeStamp_Sys100NSOUTPUT
EXEC [sys].[sp_OAGetProperty] @CO, 'Frequency_Perftime',@Frequency_PerftimeOUTPUT
EXEC [sys].[sp_OAGetProperty] @CO, 'TimeStamp_PerfTime',@TimeStamp_PerfTimeOUTPUT
EXEC [sys].[sp_OADestroy] @CO
EXEC [sys].[sp_OADestroy] @WmiS
EXEC [sys].[sp_OADestroy] @WmiSl
if (@TimeStamp_PerfTime2 != '0')
begin
SET @timeDelta = cast(@TimeStamp_PerfTime AS decimal(30,3)) - cast(@TimeStamp_PerfTime2 AS decimal(30,3));
SET @readsDelta = cast(@AvgDisksecPerRead AS decimal(30,3)) - cast(@AvgDisksecPerRead2 AS decimal(30,3));
if (@readsDelta > 0)
begin
SET @res = ((@timeDelta / cast(@Frequency_Perftime AS decimal(30,3))) * 1000.0) / @readsDelta;
PRINT @res;
PRINT @timeDelta;
PRINT @readsDelta;
end
end
PRINT@AvgDisksecPerRead + ' base ' +@AvgDisksecPerRead_Base + ' time ' + @TimeStamp_PerfTime + ' freq ' + @Frequency_Perftime + ' time100 ' + @TimeStamp_Sys100NS + ' ';
PRINT@AvgDisksecPerRead2 + ' base ' +@AvgDisksecPerRead_Base2 + ' time ' + @TimeStamp_PerfTime2 + ' freq ' + @Frequency_Perftime2 + ' time100 ' + @TimeStamp_Sys100NS2 + ' ';
PRINT''
SET@AvgDisksecPerRead2= @AvgDisksecPerRead;
SET@AvgDisksecPerRead_Base2= @AvgDisksecPerRead_Base;
SET@TimeStamp_PerfTime2= @TimeStamp_PerfTime;
SET@Frequency_Perftime2= @Frequency_Perftime;
SET @TimeStamp_Sys100NS2= @TimeStamp_Sys100NS;
WAITFOR DELAY '00:00:5';
END