查看sys.dm_os_wait_stats时,以下列定义为BIGINT
- waiting_tasks_count
- 等待时间毫秒
- 最大等待时间毫秒
如果这些值中的任何一个超过9,223,372,036,854,775,807
,计数器是重置为 0,还是干脆停止计数?
从表定义中不清楚幕后发生了什么:
sp_helptext 'sys.dm_os_wait_stats'
退货:
CREATE VIEW sys.dm_os_wait_stats AS
SELECT *
FROM OpenRowset(TABLE SYSWAITSTATS)
所以这有点像一个黑盒子。
在某些 DMV 中,大数字可能会变为负数。一个例子是 中的total_elapsed_time
列dm_exec_requests
。
根据文档:
我在较早版本的 SQL Server 中看到过这种情况,其中发生了翻转,并且您会得到负数,因为这些值是有符号的。
我查看了源代码,确实这些是 8 字节有符号值。因为这都是 C++,所以我创建了一个简单的重现:
输出类似于我在以前版本的 SQL Server 中遇到的情况,签名值被翻转。请注意,如果您编译它,您应该会收到一个编译器警告,提示将发生翻转 - 我收到了编译器警告 4307。
以上输出:
我并不是说这正是 SQL Server 在所有情况下的工作方式,因为存在许多细微差别……但这应该是一个类似的近似值。
这一切究竟意味着什么?
正如 Aaron 所说,我非常怀疑在当前的硬件环境下您是否会遇到 64 位值的翻转。如果你这样做了,就很容易发现,而且在我看来,报告不准确比任何实际问题都要多。