查看sys.dm_os_wait_stats 时,以下列定义为BIGINT
如果这些值中的任何一个超过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_time列dm_exec_requests。
根据文档:
在 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 位值的翻转。如果你这样做了,在我看来,它很容易被发现,而且报告的不准确性比任何真正的问题都要多。
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |