Por que demora tanto tempo para calcular um plano de execução?

9

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.

Mongus Pong
fonte
11
Você tem certeza de que a compilação do plano está demorando muito, e não apenas a leitura de dados no cache do disco?
Mark-Storey-Smith
11
O tempo de compilação é exibido no próprio XML do plano. Você identificou que é definitivamente um tempo de compilação e não outra coisa, por exemplo, atualização automática síncrona de estatísticas? Em qual versão do SQL Server você está?
Martin Smith
@ MarkStorey-Smith Bem, eu realmente não tenho certeza de nada. Sei que a execução do DBCC FREEPROCCACHE , que limpa apenas o cache do plano, levará o próximo tempo de consulta até 3 minutos.
Mongus Pong
@ MartinSmith Ah, sim, muito útil, eu tenho usado o plano de consulta visual. Sim, o tempo de compilação é aproximadamente o tempo inteiro de execução da consulta. Estamos no SQL Server 2008 R2.
Mongus Pong
@ MongusPong - Se você criar uma cópia apenas estatística do banco de dados de produção, poderá reproduzi-la em seu ambiente de teste? O que o plano diz StatementOptmEarlyAbortReason?
Martin Smith

Respostas:

9

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

exec sp_updatestats

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)

Mongus Pong
fonte