Por que essas duas consultas produzem resultados diferentes (mas com cerca de um minuto de diferença uma da outra)?
SELECT StartTime = sqlserver_start_time
FROM sys.dm_os_sys_info;
SELECT StartTime = DATEADD(MILLISECOND, sqlserver_start_time_ms_ticks - ms_ticks, GETDATE())
FROM sys.dm_os_sys_info;
Qual é o mais preciso?
Nem são os MAIS precisos [A], no entanto, parece que os cálculos duvidosos de data podem ser um pouco mais precisos [C] se essas forem suas duas únicas opções.
Eles pareciam ser armazenados de duas maneiras diferentes [B], e sem ir muito fundo (mas profundo o suficiente) o tempo de processamento extra junto com onde eles são definidos, e o tempo gasto em módulos de terceiros está fazendo a diferença.
Mergulho profundo
[A] O tempo de início do processo mais preciso é o que o Windows tem para a estrutura do processo, que pode ser facilmente consultado via powershell ou WinAPI. Começo o SQL Server em um depurador para ver se há uma maneira fácil de descobrir isso, pois posso adicionar qualquer atraso de tempo que desejar. Dado que algo como hora de início/tiques faria sentido para ser um item mais global a ser rastreado, tentei usar símbolos públicos para ver se conseguia encontrá-lo e introduzir artificialmente um intervalo de tempo decente. A figura abaixo é quando o processo foi iniciado no depurador, de acordo com o Windows, que é o horário mais preciso - 22/11/2022 11:46:23 AM, vamos nos referir a esse valor.
[B] Em seguida, vasculhei as exportações de símbolos públicos para qualquer coisa no sqldk, já que é a dll que está essencialmente fazendo a inicialização do sistema operacional SQL, o que faria mais sentido como um local para obter/definir as informações ou hora de inicialização.
De fato, existem acessos para isso que parecem interessantes, junto com algumas funções que podem ser bons lugares para definir pontos de interrupção. Observe que os valores destacados parecem corresponder razoavelmente bem ao DMV.
[C] Reinicie o processo no depurador, definindo
ba
itens para os dois valores aparentemente globais e definindo uma interrupção no carregamento do módulo sqldk. Os Ticks e Time são definidos essencialmente na mesma área nasqldk!SOS_OS::InitOs
função, no entanto, para oTimeWhenSOSBooted
valor, uma chamada é feita no kernel para GetSystemTimeAsFileTime , o que levará um tempo extra de processamento e adicionalmente pode ser desviado, entre outros métodos usados por programas anti*.Como consegui adicionar atrasos, o resultado final é o seguinte.
Assim, parece que os ticks são definidos primeiro e são mais precisos entre os dois valores (mesmo levando em conta problemas de arredondamento e matemática), mas não são precisos no esquema geral das coisas, pois isso pertence ao valor do tempo de criação do processo do Windows que introduzi um total de 1+ minutos de diferença de horário.