Desculpe demorar, mas quero fornecer o máximo de informações possível, para que possa ser útil para a análise.
Sei que existem várias postagens com problemas semelhantes; no entanto, eu já acompanhei essas várias postagens e outras informações disponíveis na Web, mas o problema permanece.
Estou com um sério problema de desempenho no SQL Server que está deixando os usuários loucos. Esse problema se prolonga por vários anos, e até o final de 2016 era gerenciado por outra entidade e a partir de 2017 passou a ser gerenciado por mim.
Em meados de 2017, consegui resolver o problema seguindo as dicas de indexação indicadas pelos Relatórios do Painel de Desempenho do Microsoft SQL Server 2012. O efeito foi imediato, parecia mágica. O processador que estava nos últimos dias quase sempre nos 100% tornou-se super sereno e o feedback dos usuários foi retumbante. Até o nosso técnico de ERP ficou encantado, pois normalmente levava 20 minutos para obter determinadas listagens e, finalmente, ele conseguia fazê-lo em segundos.
Com o tempo, no entanto, lentamente começou a piorar. Evitei criar mais índices, por medo de que muitos índices piorassem o desempenho. Mas em algum momento eu tive que apagar os que não tinham utilidade e criar os novos que o Performance Dashboard me sugere. Mas sem impacto.
A lentidão sentida é essencialmente ao salvar e consultar, no ERP.
Eu tenho um Windows Server 2012 R2 dedicado ao SQL Server 2016 Enterprise (64 bits) com a seguinte configuração:
- CPU: Intel Xeon CPU E5-2650 v3 a 2.30GHz
- Memória: 84 GB
- Em termos de armazenamento, o servidor possui um volume dedicado ao sistema operacional, outro dedicado aos dados e outro dedicado aos logs.
- 17 bases de dados
- Comercial:
- No maior banco de dados estão conectados mais ou menos 113 usuários simultaneamente
- Em outro, existem cerca de 9 usuários
- Em dois deles são 3 + 3
- O restante tem apenas 1 usuário cada
- Temos uma web que também grava para um banco de dados maior, mas onde o uso é muito menos regular e deve ter cerca de 20 usuários.
- Tamanho dos DBs:
- O maior dos bancos de dados possui 290 GB
- O segundo maior tem 100 GB
- O terceiro maior tem 20 GB
- Os quarto 14 GB
- O restante tem pouco mais de 3 GB cada
Essa é a instância de produção, mas também temos uma instância de desenvolvimento que acredito que pode ser desconsiderada para esse fim, porque na maioria das vezes eu sou a única conexão lá, mas esse problema ocorre constantemente, mesmo quando não estou conectado .
O processador é quase sempre assim:
Temos rotinas que são executadas durante a noite (não problemáticas) e algumas que são executadas durante o dia.
Os usuários se conectam pela Área de Trabalho Remota a outras máquinas configuradas pelo ODBC 32 para acessar o SQL Server.
O Datacenter onde os servidores estão localizados tem 100/100 Mbps, bem como onde eu estou. A maioria dos sites é vinculada pelo MPLS e outros pelo IPSec (de FO a 4G). O fornecedor fez muitas análises e o circuito está ok.
A taxa de acertos do cache é de 99% (solicitações de usuário e sessões de usuário)
As esperas são assim:
Já coletei dados com o Perfmon e tenho os resultados, se isso ajudar na sua análise - pessoalmente, não tirei nenhuma conclusão da análise.
Conto com o seu apoio para resolver esse problema, estando disponível para fornecer as informações que você considera necessárias para a resolução.
Muito obrigado.
Aqui está a remarcação sp_blitz (substituí os nomes das empresas por pseudônimos):
Prioridade 1: Confiabilidade :
Último bom DBCC CHECKDB com mais de 2 semanas
- mestre
modelo - Último sucesso CHECKDB: 2018-02-07 15: 04: 26.560
msdb - Último sucesso CHECKDB: 2018-02-07 15: 04: 27.740
Prioridade 10: Desempenho :
CPU com número ímpar de núcleos
O nó 0 possui 5 núcleos atribuídos a ele. Essa é uma configuração NUMA muito ruim.
O nó 1 possui 5 núcleos atribuídos a ele. Essa é uma configuração NUMA muito ruim.
Prioridade 20: Configuração do arquivo :
- TempDB na unidade C tempdb - O banco de dados tempdb possui arquivos na unidade C. O TempDB cresce frequentemente de maneira imprevisível, colocando o servidor em risco de ficar sem espaço na unidade C e travar bastante. C também costuma ser muito mais lento que outras unidades, portanto o desempenho pode estar sofrendo.
Prioridade 50: Confiabilidade :
- Erros registrados recentemente no rastreamento padrão
- master - 2018-03-07 08: 43: 11.72 Erro de logon: 17892, Gravidade: 20, estado: 1. 2018-03-07 08: 43: 11.72 O logon falhou no logon 'example_user' devido à execução do acionador. [CLIENTE: IPADDR]
(observação: muitos erros como esse devido a um acionador ativado que limita as sessões do usuário - para controle de uso de licenciamento do ERP)
A verificação da página não é a ideal
DATABASE_A - O banco de dados [DATABASE_A] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_B - O banco de dados [DATABASE_B] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_C - O banco de dados [DATABASE_C] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_D - O banco de dados [DATABASE_D] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_E - O banco de dados [DATABASE_E] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_F - O banco de dados [DATABASE_F] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_G - O banco de dados [DATABASE_G] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_H - O banco de dados [DATABASE_H] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_I - O banco de dados [DATABASE_I] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_Z - O banco de dados [DATABASE_Z] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_K - O banco de dados [DATABASE_K] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_J - O banco de dados [DATABASE_J] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_L - O banco de dados [DATABASE_L] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_M - O banco de dados [DATABASE_M] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_O - O banco de dados [DATABASE_O] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_P - O banco de dados [DATABASE_P] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_Q - O banco de dados [DATABASE_Q] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_R - O banco de dados [DATABASE_R] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_S - O banco de dados [DATABASE_S] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_T - O banco de dados [DATABASE_T] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_U - O banco de dados [DATABASE_U] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_V - O banco de dados [DATABASE_V] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DATABASE_X - O banco de dados [DATABASE_X] possui NONE para verificação da página. O SQL Server pode ter mais dificuldade em reconhecer e se recuperar de corrupção de armazenamento. Considere usar CHECKSUM.
DAC remoto desativado - O acesso remoto ao DAC (Dedicated Admin Connection) não está ativado. O DAC pode facilitar muito a solução de problemas remotos quando o SQL Server não responde.
Prioridade 50: Informações do servidor :
- Inicialização instantânea de arquivos não ativada - considere ativar o IFI para restaurações mais rápidas e aumento de arquivos de dados.
Prioridade 100: Desempenho :
Fator de preenchimento alterado
DATABASE_A - O banco de dados [DATABASE_A] possui 417 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_B - O banco de dados [DATABASE_B] possui 318 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_C - O banco de dados [DATABASE_C] possui 346 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_D - O banco de dados [DATABASE_D] possui 663 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_E - O banco de dados [DATABASE_E] possui 335 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_F - O banco de dados [DATABASE_F] possui 1705 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_G - O banco de dados [DATABASE_G] possui 671 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_H - O banco de dados [DATABASE_H] possui 2364 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_I - O banco de dados [DATABASE_I] possui 1658 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_Z - O banco de dados [DATABASE_Z] possui 673 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_K - O banco de dados [DATABASE_K] possui 312 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_J - O banco de dados [DATABASE_J] possui 864 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_L - O banco de dados [DATABASE_L] possui 1170 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_M - O banco de dados [DATABASE_M] possui 382 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_O - O banco de dados [DATABASE_O] possui 356 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
msdb - O banco de dados [msdb] possui 8 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_P - O banco de dados [DATABASE_P] possui 291 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_Q - O banco de dados [DATABASE_Q] possui 343 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_R - O banco de dados [DATABASE_R] possui 2048 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_S - O banco de dados [DATABASE_S] possui 325 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_T - O banco de dados [DATABASE_T] possui 322 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_U - O banco de dados [DATABASE_U] possui 351 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_V - O banco de dados [DATABASE_V] possui 312 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
DATABASE_X - O banco de dados [DATABASE_X] possui 352 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
tempdb - O banco de dados [tempdb] possui 2 objetos com fator de preenchimento = 70%. Isso pode causar problemas de desempenho de memória e armazenamento, mas também pode impedir a divisão de páginas.
Muitos planos de planos para uma consulta - 20763 estão presentes para uma única consulta no cache do plano - o que significa que provavelmente temos problemas de parametrização.
Acionadores de servidor ativados - O acionador de servidor [connection_limit_trigger] está ativado. Certifique-se de entender o que esse gatilho está fazendo - quanto menos trabalho ele fizer, melhor.
Procedimento armazenado COM RECOMPILE
master - [master]. [dbo]. [sp_AllNightLog] possui WITH RECOMPILE no código do procedimento armazenado, o que pode causar um aumento no uso da CPU devido a constantes recompilações do código.
master - [master]. [dbo]. [sp_AllNightLog_Setup] possui WITH RECOMPILE no código do procedimento armazenado, o que pode causar aumento no uso da CPU devido a recompilações constantes do código.
Prioridade 110: Desempenho :
Tabelas ativas sem índices agrupados
DATABASE_A - O banco de dados [DATABASE_A] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_B - O banco de dados [DATABASE_B] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_C - O banco de dados [DATABASE_C] possui heaps - tabelas sem um índice clusterizado - que estão sendo consultados ativamente.
DATABASE_E - O banco de dados [DATABASE_E] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_F - O banco de dados [DATABASE_F] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_H - O banco de dados [DATABASE_H] possui heaps - tabelas sem um índice clusterizado - que estão sendo consultados ativamente.
DATABASE_I - O banco de dados [DATABASE_I] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_K - O banco de dados [DATABASE_K] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_O - O banco de dados [DATABASE_O] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_Q - O banco de dados [DATABASE_Q] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_S - O banco de dados [DATABASE_S] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_T - O banco de dados [DATABASE_T] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_U - O banco de dados [DATABASE_U] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_V - O banco de dados [DATABASE_V] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
DATABASE_X - O banco de dados [DATABASE_X] possui heaps - tabelas sem um índice em cluster - que estão sendo consultados ativamente.
Prioridade 150: Desempenho :
(Observação: muitos conselhos aqui, mas não os pude incluir por causa da limitação de caracteres. Se houver outra maneira de compartilhar, indique.)