Eu gostaria de saber como identificar a consulta exata ou o proc armazenado que está realmente preenchendo o log transacional do banco de dados TEMPDB.
relate perguntas
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Quanto "Padding" coloco em meus índices?
-
Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?
-
Como determinar se um Índice é necessário ou necessário
-
Downgrade do SQL Server 2008 para 2005
De http://www.sqlservercentral.com/scripts/tempdb/72007/
EDITAR
Como Martin apontou em um comentário, isso não localizaria transações ativas que estão ocupando espaço no tempdb, ele encontrará apenas consultas ativas que estão atualmente utilizando espaço lá (e provavelmente culpados pelo uso atual do log). Portanto, pode haver uma transação aberta, mas a consulta real que causa o problema não está mais em execução.
Você pode alterar
inner join
onsys.dm_exec_requests
para aleft outer join
e retornará linhas para sessões que não estão executando consultas ativamente no momento.A consulta que Martin postou...
... identificaria
session_id
s com transações ativas que estão ocupando espaço de log, mas você não seria necessariamente capaz de determinar a consulta real que causou o problema, pois se não estiver em execução agora, não será capturada na consulta acima para solicitações ativas. Você pode verificar de forma reativa a consulta mais recente usandoDBCC INPUTBUFFER
, mas pode não dizer o que você deseja ouvir. Você pode fazer a junção externa de maneira semelhante para capturar aqueles em execução ativa, por exemplo:Você também pode usar o DMV
sys.dm_db_session_space_usage
para ver a utilização geral do espaço por sessão (mas, novamente, você pode não obter resultados válidos para a consulta; se a consulta não estiver ativa, o que você receber de volta pode não ser o culpado real).Com todas essas consultas à sua disposição, você deve ser capaz de restringir quem está usando tempdb e como, especialmente se você pegá-los em flagrante.
algumas dicas para minimizar a utilização do tempdb
SORT_IN_TEMPDB
opção se não for necessáriaVocê também pode considerar que seu uso de log tempdb pode ser causado por processos internos sobre os quais você tem pouco ou nenhum controle - por exemplo, correio de banco de dados, notificações de eventos, notificações de consulta e agente de serviço, todos usam tempdb de alguma forma. Você pode parar de usar esses recursos, mas se os estiver usando, não poderá ditar como e quando eles usam tempdb.
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/17d9f862-b9ae-42de-ada0-4229f56712dc/tempdb-log-filling-cannot-find-how-or-what?forum=sqldatabaseengine
Obrigado por este post, provavelmente o único de seu tipo. Meu teste foi simples, crie uma tabela temporária e certifique-se de que ela apareça quando eu executar qualquer uma das consultas deste post... apenas uma ou duas foram realmente bem-sucedidas. Corrigi-o para se juntar ao T-SQL, otimizei-o para execuções mais longas e o tornei bastante útil. Deixe-me saber se eu perdi alguma coisa, mas até agora você tem um script automatizado / em loop. Ele fornece uma maneira de avaliar qual consulta/SPID é o infrator durante um período de tempo usando a consulta de desvio padrão (STDEV) abaixo.
Isso é executado a cada 3 minutos por 40 vezes, ou seja, 2 horas. Modifique os parâmetros como achar melhor.
Há um filtro WHERE > 50 páginas abaixo que as pessoas podem querer limpar caso você tenha muitas tabelas pequenas. Caso contrário, você não vai pegar essa nuance com o abaixo como é ...
Apreciar!
Infelizmente, o log do tempDB não pode ser rastreado diretamente para os sessionIDs visualizando os processos em execução.
Reduza o arquivo de log tempDB até um ponto em que ele cresça significativamente novamente. Em seguida, crie um evento estendido para capturar o crescimento do log. Quando ele crescer novamente, você poderá expandir o evento estendido e visualizar o arquivo de evento do pacote. Abra o arquivo, adicione um filtro de tempo, filtro de tipo de arquivo (você não deseja que os resultados do arquivo de dados sejam incluídos) e, em seguida, agrupe-o por ID de sessão no SSMS. Isso irá ajudá-lo a encontrar o(s) culpado(s), pois você está procurando por ids de sessão com o maior número de grupos. Claro que você precisa coletar o que está sendo executado nos IDs de sessão por meio de outro processo ou ferramenta. Talvez alguém saiba como obter a consulta da coluna query_hash e tenha a gentileza de postar a solução.
Resultados do evento estendido:
Script para criar o evento estendido: