Recentemente, atualizamos um de nossos servidores de produção do SQL Server 2016 para o SQL Server 2019 (CU 15). Essa foi uma ótima oportunidade para habilitar o Query Store em nosso banco de dados de aplicativos principal. Ele está em execução há alguns dias e é isso que o Relatório geral de consumo de recursos está mostrando:
Na captura de tela, selecionei alguns números que pareciam insanos (para o primeiro dia em que o Query Store foi ativado) e os normalizei para unidades de medida mais fáceis de serem discutidas. Coisas como ~183 TB de dados consumidos por leituras lógicas ou ~5 TB de dados consumidos pela memória, em um único dia, parecem quase impossíveis neste servidor.
Esse banco de dados é o John Smith dos bancos de dados, com apenas 100 GB de tamanho para o arquivo de dados e 200 GB para o arquivo de log. No máximo, talvez 100 usuários diferentes se conectam a ele ao longo do dia, e não há uma tonelada de transações sendo criadas em um único dia. O próprio servidor possui apenas 32 GB de memória provisionada para ele. Para que 5 TB de memória sejam consumidos, a memória alocada precisaria ser preenchida mais de 150 vezes ao longo do dia.
A única outra informação potencialmente relevante que posso pensar em adicionar é que, após a atualização, definimos imediatamente o "Nível de compatibilidade" desse banco de dados para 150 (SQL Server 2019) e deixamos a configuração "Estimativa de cardinalidade herdada" desativada. Eu sei que não é o ideal e é melhor deixar a poeira baixar enquanto coletamos as métricas básicas, mas parte do motivo da atualização foi corrigir alguns problemas urgentes de desempenho para os quais essa combinação de configurações funcionou melhor em nossos testes (e ainda parece estar funcionando muito bem).
Alguns dos problemas de desempenho anteriores que estávamos tendo eram devido a estimativas de cardinalidade insanas, que se o Query Store estivesse usando os pontos de dados estimados , então eu poderia ver os números deste relatório sendo correlativos, mas eu teria que imaginar que o relatório é usando pontos de dados reais ? Embora fosse interessante se isso fosse outro sinal de algo fundamentalmente errado com a forma como meu servidor / banco de dados de produção está configurado em minha conquista contínua para eliminar problemas de estimativa de cardinalidade.
Estou lendo esses números errado, o Query Store está bugando ou meu servidor está travando?
Minha estação de trabalho pode fazer cerca de 100K-150K LIO/CPU Second. Um Logical IOs (LIO) está lendo uma única página de 8 KB do cache de página. Ou seja, ao executar uma grande varredura paralela de uma tabela em cache com um plano de consulta trivial, recebo estatísticas de E/S como:
E com MAXDOP 1 a mesma varredura leva apenas 3625 ms de CPU. E está rodando Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz.
Durante o período, você tem 22.902.891.616 KB de E/S Lógica, cada LIO tem 8 KB, então
22902891616/8
LIO e 20.393.171 ms de tempo de CPU. Entãoou
140.383 LIO/CPU Segundo. Portanto, o número de E/S lógicos corresponde aproximadamente ao uso total da CPU e você tem uma média de 33.000 LIO/seg no período de 24 horas.
Dado que você atualizou para 2019 com todo o comportamento do otimizador mais recente, você provavelmente tem alguns planos ruins que estão causando varredura excessiva, mas a velocidade do servidor e o tamanho moderado estão mantendo sua taxa de acertos de cache muito alta e mantendo o desempenho percebido aceitável.
Não tenho certeza do que essa métrica de memória significa. Esta é a consulta por trás do relatório:
e
não me parece uma métrica muito útil.
Como observação geral, acho que ninguém aqui pode responder à sua pergunta com 100% de confiança. Não temos base. No entanto, aqui estão algumas idéias sobre o que você pode fazer:
Você tem alguma métrica coletada em ambos os servidores? Você pode compará-los?
Os números no pop-up parecem ser cumulativos para todo o banco de dados para todas as consultas. Se minha matemática estiver correta, a duração média da consulta é de 400ms. Isso é comparável ao servidor antigo?
Compare o uso da CPU. Por um dia são 5,5h no novo servidor. Assumindo 1 CPU lógica, é ~ 25% de uso médio da CPU. Assumindo 2 CPUs lógicas é 12,5% etc. Não temos os números para nenhum dos servidores, mas sabendo o uso médio de CPU e a contagem de processador lógico em ambos, você poderá comparar o tempo de CPU desses dois. Assumindo 2 CPUs lógicas, eu diria que o uso é baixo. As estatísticas de espera também são comparativamente baixas (presumo que o tempo de espera na captura de tela significa espera). Então, a menos que você tenha veneno, você está bem na minha opinião.
Em geral, eu compararia as estatísticas de espera entre o servidor antigo e o novo. Se o novo servidor esperar menos, provavelmente você está bem.
Finalmente: os usuários estão reclamando que algumas partes do aplicativo estão mais lentas agora? Isso seria um forte indício de que algumas consultas regrediram.