`sys.dm_os_wait_stats` 中的值是否会在达到最大值时重置为 0 或停止累积?

Eri*_*ing 7 sql-server dmv

查看sys.dm_os_wait_stats 时,以下列定义为BIGINT

  • waiting_tasks_count
  • wait_time_ms
  • max_wait_time_ms

如果这些值中的任何一个超过9,223,372,036,854,775,807,计数器是否重置为 0,或者只是停止计数?

从表定义中不清楚幕后发生了什么:

sp_helptext 'sys.dm_os_wait_stats'
Run Code Online (Sandbox Code Playgroud)

返回:

CREATE VIEW sys.dm_os_wait_stats AS  
 SELECT *  
 FROM OpenRowset(TABLE SYSWAITSTATS)  
Run Code Online (Sandbox Code Playgroud)

所以这有点像一个黑匣子。

在某些 DMV 中,大量数字可能会变为负数。一个例子是 中的total_elapsed_timedm_exec_requests

Sea*_*ser 9

根据文档

在 SQL Server 中,等待时间计数器是 bigint 值,因此不像 SQL Server 早期版本中的等效计数器那样容易发生计数器翻转。

我已经在 SQL Server 的早期版本中看到了这一点,其中发生了翻转,并且您会得到负数,因为这些值是有符号的。

我查看了源代码,确实这些是 8 字节有符号值。由于这都是 C++,我创建了一个简单的重现:

#include "stdint.h"
#include <iostream>

using namespace std;

int main()
{
    int64_t i8 = 0;
    cout << "Size of integer: " << sizeof(i8) << " bytes." << endl;
    cout << "Max Value: " << INT64_MAX << endl;
    i8 = INT64_MAX + 1;
    cout << "Value of MAX + 1: " << i8 << endl;
    cin;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出类似于我在以前版本的 SQL Server 中所经历的,签名值被翻转。请注意,如果你编译它,你应该得到一个编译器警告,会发生翻转——我收到了编译器警告 4307

以上输出:

Size of integer: 8 bytes.
Max Value: 9223372036854775807
Value of MAX + 1: -9223372036854775808
Run Code Online (Sandbox Code Playgroud)

指出这正是SQL Server如何适用于所有并因为有许多细微之处每一个案件...但是这应该是一个类似的近似。

这一切究竟意味着什么?

我非常怀疑,正如 Aaron 所说,在当前的硬件环境中,您是否会遇到 64 位值的翻转。如果你这样做了,在我看来,它很容易被发现,而且报告的不准确性比任何真正的问题都要多。