Temos um servidor de banco de dados do SQL Server 2008 (ele está sendo executado no MS Failover Clustering, mas não acho relevante aqui).
Nosso aplicativo executa o Hibernate para acesso ao banco de dados e, desde que atualizamos recentemente da v3.1 para 3.6, estamos enfrentando falhas do SQL Server regularmente (a cada 24-48 horas, mas às vezes com mais freqüência).
O problema específico em questão parece estar relacionado à memória. Pouco antes do servidor travar (e é reiniciado automaticamente pelo gerenciador de cluster de failover, ao que parece), recebemos uma carga desses erros:
Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.
também mensagens ocasionais (mas regulares) de
Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.
Erro: 17312, Gravidade: 16, Estado: 1. (Params :). O erro é impresso no modo conciso porque ocorreu um erro durante a formatação. Rastreamento, ETW, notificações etc são ignoradas.
Também estou recebendo alguns erros no nível do aplicativo, como
java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.
e então o erro emocionante e possivelmente instrutivo:
The query processor ran out of internal resources and could not produce a query plan.
This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions.
Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.
A carga no servidor não foi alterada; portanto, não há motivo para ficar sem memória agora, quando anteriormente não estava indicando um problema com as consultas enviadas a ele.
Agora, para a pergunta - como rastrear as consultas que estão causando esse erro (e, portanto, presumivelmente todos os problemas)? Parece que desde a nossa atualização do Hibernate, ele disparou algumas consultas enormes no SQL Server, e isso foi interrompido. Por acaso, tenho algumas idéias sobre o que elas podem ser, mas seria bom poder rastreá-las.
É claro que posso executar o criador de perfil do SQL Server, mas uma vez feito isso (e produzindo uma quantidade enorme de dados - é um banco de dados OLTP ocupado), como filtrar para encontrar as consultas problemáticas?
Obrigado!