Eu tenho dois servidores SQL Server 2008 R2 Enterprise SP1 com valores diferentes para sys.dm_os_sys_info.time_source
.
A time_source
coluna de sys.dm_os_sys_info
indica a API que o SQL Server está usando para recuperar o horário do relógio:
0 = QUERY_PERFORMANCE_COUNTER
1 = MULTIMEDIA_TIMER
O que causa a diferença e posso alterar o SQL Server para usar o QUERY_PERFORMANCE_COUNTER
valor mais preciso?
+--------------------------+---------------------- -----+-------------------------+ | | Original | Novo | +--------------------------+---------------------- -----+-------------------------+ | time_source | QUERY_PERFORMANCE_COUNTER | MULTIMEDIA_TIMER | | instalação do sistema operacional | limpo | limpo | | virtual/físico | físico | virtuais | | hipervisor | n/a | vmware, ESXi 5.5 | | Versão do hardware VMware | n/a | 7 | | bcd x | optin | desativar | | recuperação bcd habilitada | não | sim | | bcd /usepmtimer | não | não | | sku sql | padrão sql 2008 r2 | padrão sql 2008 r2 | | atualização sql do expresso | não | não | | sql fecha automaticamente qualquer banco de dados | não | não | | plano de energia | alto desempenho | equilibrado | | dm_os_performance_counter| sim | sim | +--------------------------+---------------------- -----+-------------------------+
Meu colega de trabalho enviou este link muito interessante: How It Works: Timer Outputs in SQL Server 2008 R2
O VMWare usa uma API diferente para fonte de tempo, dependendo da versão do sistema operacional e da versão do hardware da VM. Eles também têm um whitepaper com muitos detalhes.
De acordo com o MSDN , o SQL Server usa a seguinte lógica para decidir qual timer usar:
A explicação acima responde indiretamente às suas perguntas:
sys.dm_os_sys_info
.Reiniciamos a maioria dos nossos servidores no fim de semana. Comparei a lista de máquinas usando
MULTIMEDIA_TIMER
antes e depois da reinicialização. Agora posso relatar que alguns dos servidores que estavam usandoMULTIMEDIA_TIMER
agora estão usandoQUERY_PERFORMANCE_COUNTER
e vice-versa.Como nossos servidores são virtualizados, presumo que a inicialização simultânea de máquinas em nosso ambiente virtualizado esteja fazendo com que algumas máquinas levem mais de 600 ciclos de CPU para retornar um valor por meio da
QueryPerformanceCounter
API. Este efeito parece ser distribuído aleatoriamente em nosso ambiente.