Eu armazenei um procedimento que atinge o tempo limite insanamente toda vez que é chamado do aplicativo da web.
Eu iniciei o Sql Profiler e rastreei as chamadas que expiraram e finalmente descobri estas coisas:
- Ao executar as instruções de dentro do MS SQL Management Studio, com os mesmos argumentos (na verdade, copiei a chamada de procedimento do rastreamento do perfil sql e executei): Termina em 5 ~ 6 segundos em média.
- Mas, quando chamado de um aplicativo da web, leva mais de 30 segundos (em rastreamento), então minha página da web atinge o tempo limite até lá.
Além do fato de que meu aplicativo web tem seu próprio usuário, tudo é igual (mesmo banco de dados, conexão, servidor etc), também tentei executar a consulta diretamente no estúdio com o usuário do aplicativo web e não leva mais de 6 seg.
Como faço para descobrir o que está acontecendo?
Estou assumindo que não tem nada a ver com o fato de usarmos camadas BLL> DAL ou adaptadores de tabela, pois o rastreamento mostra claramente que o atraso está no procedimento real. Isso é tudo em que consigo pensar.
EDIT Eu descobri neste link que o ADO.NET define ARITHABORT
como verdadeiro - o que é bom na maioria das vezes, mas às vezes isso acontece, e a solução sugerida é adicionar uma with recompile
opção ao procedimento armazenado. No meu caso, não está funcionando, mas suspeito que seja algo muito semelhante a isso. Alguém sabe o que mais o ADO.NET faz ou onde posso encontrar a especificação?