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!
fonte
Respostas:
Siga as etapas descritas em Como usar o
DBCC MEMORYSTATUS
comando para monitorar o uso de memória no SQL Server . A ação do remédio dependerá de suas descobertas. Você também pode ler Como identificar gargalos de memória do Microsoft SQL Server, que é mais acessível.Porém, uma palavra de cautela: é improvável que você encontre consultas individuais para culpar. Rastrear problemas de memória é mais sutil que isso. Lembre-se de que, quando os recursos estão acabando, e uma consulta gera um erro de falta de memória, pode ser que a consulta que gera o erro seja apenas a vítima , não o culpado.
fonte
Parece que você deseja fazer a
Extended Events
configuração usando os eventosquery_memory_grant_xxxxx
.Essa é a melhor opção para você registrar as informações e o Mecanismo SQL de tamanho armazenado, que você pode ler a qualquer momento (também é possível assistir a dados ao vivo); as informações armazenadas não serão apagadas quando a reinicialização do servidor ocorrer diferente
DMVs
Etapas de configuração rápida.
fonte