Temos um banco de dados SQL Server 2005, o banco de dados temporário ficou cheio. Ao entrar no SQL Server Management Studio, posso ver todas as tabelas temporárias no tempdb. É possível saber qual sessão está mantendo qual tabela temporária? Idealmente, uma consulta que listaria as tabelas temporárias usadas por cada sessão.
Obrigado,
sql-server
sql-server-2005
tempdb
SQLMIKE
fonte
fonte
Respostas:
Eu pedi que algo fosse construído em 2007, no Connect. Isso foi rejeitado na versão de 2008 e subsequentemente ignorado, até que o Connect morreu alguns anos atrás. Tentei encontrá-lo no novo site de feedback do SQL Server , mas essa pesquisa é um incêndio absoluto no lixão. O título da minha solicitação era "dmv para mapear a tabela temporária para session_id" - como a pesquisa só pode executar OR, "map temp table" retorna 118 páginas de resultados. O Google parece sugerir que o item não foi cortado quando mataram o Connect .
Enquanto isso, para o SQL Server 2005 e 2008, você deve conseguir extrair essas informações do rastreamento padrão:
Desavergonhadamente retirado desta postagem no blog de Jonathan Kehayias .
Para determinar o uso do espaço, você pode aprimorá-lo ainda mais para juntar dados de visualizações como
sys.db_db_partition_stats
- por exemplo:O problema aqui é tentar correlacionar um nome de tabela pelo texto da consulta; isso simplesmente não é prático, pois na maioria das vezes, o usuário ainda não está executando uma consulta nessa tabela (não importa ainda executar a que a criou / a preencheu).
No entanto, e isso é para outros leitores (ou para você quando você atualiza), o rastreamento padrão em 2012 ou mais não rastreia mais a criação de objetos de tabela temporária , se a tabela #temp for uma pilha. Não tenho certeza se isso é uma coincidência ou diretamente relacionado ao fato de que a partir de 2012 todas as tabelas temporárias agora têm um negativo
object_id
. É claro que você poderia ir para Eventos estendidos para ajudá-lo a coletar e rastrear essas informações, mas isso é possivelmente muito trabalho manual (e verifiquei apenas que isso não é mais rastreado no rastreamento - você pode não conseguir selecioná-las em Eventos estendidos). O rastreio padrão será selecione as #temp tables criadas com uma PK ou outra restrição ou com restrições ou índices adicionados após o evento de criação, mas será necessário diminuir as restrições baseadas em tempo acima (um índice pode ser criado muito depois de 100ms após criação).Algumas outras respostas neste site que podem ser úteis:
Como identificar qual consulta está preenchendo o log de transações tempdb?
Problemas com o arquivo mdf TempDB cada vez maior
Encontre transações que estão preenchendo o armazenamento de versão
Também escrevi sobre isso em um blog, com uma sessão personalizada de Eventos estendidos para rastrear essas informações no SQL Server 2012 e posteriores:
E Paul White publicou um blog sobre a leitura de páginas diretamente (não exatamente para os fracos de coração, nem fáceis de automatizar de forma alguma):
fonte
Aqui está uma consulta que deve ajudar você a descobrir as informações que procura:
Essa consulta obtém informações úteis para as 10 principais tarefas, como páginas alocadas / desalocadas, o texto SQL das tarefas (se disponível), etc.
Essas DMVs estão cheias de ótimas informações; portanto, se você precisar de mais dados, poderá misturar e combinar com o que está puxando. Mas esse deve ser um ponto de partida para solucionar problemas das tarefas atuais de consumo de tempdb.
fonte
tempdb.sys.dm_db_partition_stats
. Infelizmente, você não pode realmente dizer qual cópia#some_table_name
pertence a qual usuário, nem sempre poderá obter o texto da instrução que faz referência a essa tabela a qualquer momento - que pode não ser a consulta que o usuário está executando no momento. Você pode querer ver isso e isso