Um de nossos clientes acabou de atualizar para um novo servidor.
Para um procedimento armazenado específico, a primeira vez que você o executa, leva mais de três minutos para ser executado. Execuções subseqüentes são inferiores a 1 segundo.
Isso me leva a acreditar que os três minutos iniciais são basicamente utilizados para o cálculo do plano de execução. Execuções subsequentes, basta usar o plano em cache e executar instantaneamente.
Em nossos bancos de dados de teste, leva cerca de 5 segundos para calcular o plano para o mesmo procedimento.
Não vejo nada de terrível no próprio plano - embora não imagine que seja relevante, pois o plano mostra quanto tempo leva para executar a consulta, não se calcula.
O servidor é um núcleo de 16 com 24 GB de memória. Nenhuma carga pesada de CPU ou memória ocorre.
O que pode estar causando um cálculo tão lento apenas em um banco de dados específico?
Que medidas posso tomar para encontrar a causa do problema?
Editar
Então, eu consegui acessar o servidor e executei a consulta com SET SHOWPLAN_XML ON .
Posso confirmar que o CompileTime da consulta está ocupando 99% do tempo de execução da consulta. O StatementOptmEarlyAbortReason é "TimeOut" , em nosso banco de dados de teste com uma cópia do banco de dados, o motivo é MemoryLimitExceeded.
fonte
StatementOptmEarlyAbortReason
?Respostas:
Detesto responder a minha própria pergunta, principalmente porque recebi muita ajuda de outras pessoas para encontrar a solução, mas aqui vai.
O problema ocorreu devido a algumas estatísticas de falha no banco de dados. Observando o plano de execução, o otimizador esperava 11,5 TB de dados retornados da consulta. Na realidade, estava recebendo 87kb. Agora eu sei que enormes diferenças entre as linhas esperadas e reais retornadas são um sinal de que as estatísticas estão desatualizadas.
Simplesmente executando
força o banco de dados a atualizar as estatísticas para todas as tabelas.
Isso reduziu o tempo de execução da consulta de 3 minutos para 6 segundos. Todo mundo é um vencedor!
Obrigado por toda a ajuda pessoal. : 0)
fonte