Peço desculpas antecipadamente se esta for uma pergunta duplicada (o que aposto que será). Fiz uma boa pesquisa e encontrei perguntas semelhantes, mas nada que parecesse uma correspondência exata.
Escrevi um relatório que leva cerca de 30 minutos para ser executado. Ele faz muitos cálculos numéricos e estou muito feliz que demore tanto para ser executado, mas isso significa que o relatório não pode ser interativo. Basicamente, o relatório deve calcular um relatório de lucros e perdas como se a empresa tivesse perdido exatamente um cliente. Em seguida, ele coloca esse cliente de volta e executa o relatório novamente como se o próximo cliente tivesse sido perdido, etc. Acho que 30 minutos é realmente um bom desempenho, considerando o quão intenso isso é.
Os usuários estão satisfeitos com este relatório sendo atualizado todas as noites e, em seguida, podem ver os resultados em cache no dia seguinte. Portanto, o plano era executar o relatório durante a noite e salvar a saída em algum lugar.
Escrevi um procedimento armazenado para fazer isso e posso executá-lo durante o dia em cerca de 30 minutos. No entanto, quando o relatório é executado durante a noite como um trabalho do SQL Agent, ele NUNCA é concluído. Ele começa às 21h e, quando chego ao trabalho no dia seguinte, encontro minha caixa de entrada inundada de e-mails dizendo que o SQL Server está quebrado, não está funcionando corretamente, etc. Eu mato o trabalho e tudo volta ao normal.
Só que não volta ao normal. O que acontece a seguir é que QUALQUER relatório executado no mesmo banco de dados atingirá o tempo limite. A única maneira de corrigir isso é esperar um dia (sem executar o relatório noturno) ou executar outra consulta no mesmo banco de dados diretamente do SSMS, pois isso parece redefinir o problema por algum motivo.
Perguntas óbvias:
- é o trabalho do SQL Agent que está causando o problema (talvez permissões)? Não, se eu executar o SQL Agent Job durante o dia, ele funcionará bem, acho que é algum tipo de problema de tempo.
- você já tentou mudar a programação? Eu tentei de tudo, desde executá-lo às 18h até executá-lo às 6h e não parece fazer nenhuma diferença.
- o que mais funciona durante a noite? Há toda uma carga de outros trabalhos que são executados para diferentes bancos de dados. Mudei o cronograma para que meu trabalho seja executado isoladamente (em teoria). Há um trabalho que executa uma otimização de índice em TODOS os bancos de dados, mas não posso desativá-lo porque ele é gerenciado externamente.
- O plano de consulta muda para outros relatórios? Não tenho como saber, se eu rodar um relatório via SSMS então funciona, se eu rodar pelo suplemento do Excel que faz exatamente a mesma coisa, mas por meio de uma conexão SQL então ele expira. Posso visualizar o processo no Activity Monitor e vê-lo rodar por muito tempo antes de finalmente morrer.
Minha opinião pessoal é que o mecanismo de consulta está tomando decisões ruins sobre qual índice usar, mas quando executo um relatório interativamente do SSMS, isso de alguma forma redefine "algo" internamente e volta a executar relatórios usando os índices corretos novamente. Não tenho evidências para fazer backup disso, exceto que o comportamento é o mesmo se eu desabilitar um dos índices em uma das tabelas de "dados brutos".
Quando digo "executar um relatório interativamente", quero dizer apenas o seguinte:
SELECT * FROM FormatMonthEndReport(2013, 1);
Onde FormatMonthEndReport é uma função com valor de tabela.
Não sei se isso é relevante, mas uso muito o APPLY em todos esses relatórios.
Imagino que mais detalhes serão solicitados, mas não quero adicionar muitos detalhes neste estágio, pois isso rapidamente se transformaria em uma parede de texto. Voltarei e verei o que é solicitado primeiro, para que meu detalhe seja mais direcionado.
Editar nº 1 - parece que executar um perfil SQL será o primeiro passo. Vou configurar isso para funcionar durante a noite e, em seguida, relatar amanhã. Preciso sair para não ter tempo de responder as outras sugestões até lá... mas não estou te ignorando!
Edição nº 2 - funcionou ontem à noite, muito estranho, pois é a primeira vez que esse trabalho é executado com sucesso durante a noite! A única coisa que parecia diferente era que o rastreamento estava sendo executado. O rastreamento detectou alguma atividade interessante e houve uma vítima de impasse por volta das 23h58. Eu verifiquei o trabalho noturno e demorou 12,5 horas para ser executado, então isso ainda está demorando mais do que deveria, mas pelo menos está sendo concluído agora.
Meu instinto é que está relacionado à detecção de parâmetros; quando você chama o TVF, você passa valores parametrizados ou valores codificados? Por exemplo:
SELECT * FROM FormatMonthEndReport(2013, 1);
terá um desempenho diferente do