Como rastrear consultas SQL que estão travando o SQL Server

9

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!

Pete Storey
fonte
11
Está tudo rodando no mesmo servidor? Significado, o servidor de aplicativos, com java, também está sendo executado no servidor de banco de dados?
precisa
11
Em associação com a pergunta do @ swasheck: Você tem um valor explícito definido para a memória máxima do SQL Server? Você descartou a pressão da memória externa?
Mike Fal
Você já tentou olhar para os traços da caixa preta? Eles podem apontar na direção certa.
datagod
Eu acabei de acertar e os rastros que deixei em execução mostram um banco de dados ocioso da perspectiva do aplicativo.
21713 Joshua
Você usa alguma pesquisa de texto completo? Além disso, qual é a edição exata no + build do servidor sql em que você está executando?
Kin Shah

Respostas:

5

Siga as etapas descritas em Como usar o DBCC MEMORYSTATUScomando 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.

Remus Rusanu
fonte
Obrigado - já olhei para eles, mas o problema é que o servidor parece funcionar bem e, de repente, fica estridente, não fica gradualmente sem memória. Também não está claro de nada que eu possa encontrar on-line qual o erro "Não há memória suficiente no sistema no pool de recursos 'interno' para executar esta consulta". realmente significa - qual é o pool de recursos interno em relação aos resultados do DBCC MEMORYSTATUS?
Este é um servidor de desenvolvimento? Em caso afirmativo, você poderia fazer o downgrade para o Hibernate 3.1 para verificar se o problema desapareceu? Você tem duas linhas de consulta iniciais e deve tentar eliminar uma delas, o SQL Server possui limites de memória definidos e está excedendo-os ou alguma outra parte do sistema está consumindo memória e o SQL Server está sendo compactado. Perfile o sistema nos horários da falha para determinar o que está acontecendo.
epo
0

Parece que você deseja fazer a Extended Eventsconfiguração usando os eventos query_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.

Shekar Kola
fonte