Ao examinar sys.dm_os_wait_stats , as colunas a seguir são definidas comoBIGINT
- wait_tasks_count
- wait_time_ms
- max_wait_time_ms
Se algum desses valores for acima 9,223,372,036,854,775,807
de , os contadores são redefinidos para 0 ou simplesmente param de contar?
Não está claro na definição da tabela o que acontece nos bastidores:
sp_helptext 'sys.dm_os_wait_stats'
Devoluções:
CREATE VIEW sys.dm_os_wait_stats AS
SELECT *
FROM OpenRowset(TABLE SYSWAITSTATS)
Então isso é um pouco de uma caixa preta.
Existem alguns DMVs onde números grandes podem se tornar negativos. Um exemplo disso é a total_elapsed_time
coluna em dm_exec_requests
.
De acordo com Docs :
Eu vi isso com a versão anterior do SQL Server em que o rollover aconteceu e você obteria números negativos porque os valores são assinados.
Dei uma olhada no código-fonte e, de fato, esses são valores assinados de 8 bytes. Como tudo isso é C++, criei uma reprodução simples:
A saída é semelhante ao que experimentei nas versões anteriores do SQL Server, o valor assinado é transferido. Observe que, se você compilar isso, deverá receber um aviso do compilador de que haverá rollover - recebi o aviso do compilador 4307 .
Saída de acima:
NÃO estou afirmando que é exatamente assim que o SQL Server funciona em todos os casos, pois há muitas nuances ... mas essa deve ser uma aproximação semelhante.
O que tudo isso realmente significa?
Eu duvido muito, como Aaron disse, que você encontre rollover nos valores de 64 bits no clima atual de hardware. Se o fizesse, seria fácil identificar e realmente seria mais uma imprecisão de relatório do que qualquer problema real na minha opinião.