Eu tenho um servidor de produção do SQL Server 2016 SP1. Está em execução sem reinicialização há 330 dias. Tudo tem corrido bem. Até a semana passada, um dia, de repente, cada consulta no servidor estava gerando uma compilação.
Normalmente, quando eu verifico o Perfmon, vejo muitas solicitações de lote/seg, mas neste dia, vi tanto solicitações/seg quanto compilações/seg.
Quando tentei ver o que está usando meu cache, não tinha nada! Eu nunca vi nada assim. Ele continuou e durante todo o dia, a CPU estava em 100%, pois estava compilando o tempo todo.
Finalmente, a TI decidiu reiniciar a máquina. Tudo foi corrigido após uma reinicialização. Mas eu queria saber, você já viu algo assim? O plano de cache pode estar corrompido ou algo assim? (Como, talvez, se eu tivesse executado um DBCC FREEPROCCACHE, ele teria se consertado sem reiniciar?)
Isso significa que devo reiniciar meu servidor pelo menos uma vez a cada seis meses?
Você deve habilitar Bloquear Páginas na Memória (LPIM).
No SQL Server 2016+, encontrei um cenário semelhante que acredito ser um bug. Quando o servidor sofre pressão de memória e o LPIM não está habilitado, o SQL Server limpa o cache do plano como parte de seu processo para liberar memória de volta para o sistema operacional. Isso no normal. O SQL Server só deve fazer isso quando houver uma condição de pouca memória.
Em alguns casos, o SQL Server continuará limpando o cache do plano, mesmo depois que a condição de pouca memória for resolvida. Isso resulta no comportamento que você está vendo. Em um servidor ocupado, você verá alguns planos entrando no cache do plano, apenas para serem eliminados segundos depois. Este não é o comportamento adequado.
A ativação do LPIM resolverá o problema. Habilitar o LPIM é uma prática recomendada para todas as instalações do SQL Server, portanto, eu recomendaria habilitá-lo para cada instância do SQL Server, independentemente da versão ou se você teve esse problema.
Para habilitar a opção de bloqueio de páginas na memória