Como encontrar as instruções SQL que causaram o crescimento do tempdb?

26

O tempdb de um servidor (SQL Server 2008) aumenta para 500 GB + várias vezes por mês. É possível descobrir quais instruções SQL causaram esse problema? O problema geralmente não é causado por junções complexas create table #temp...; insert into #temp...ou select ... into #temp...complexas.

O tamanho inicial de alguns dos arquivos tempdb também é automaticamente definido para valores muito maiores sempre. Como evitá-lo?

Em algum momento, os planos em cache impedem o redimensionamento / redução dos arquivos. Como encontrar qual deles possui o tempdb?

u23432534
fonte
11
Desculpe, são quase duas horas da manhã e estou sem combustível para responder a essa pergunta completamente, mas esses URLs podem ser úteis enquanto você espera outras respostas - mssqltips.com/sqlservertip/1432/… e google.com/search?q= quais + consultas + estão + usando + tempdb
Aaron Bertrand

Respostas:

27

Existem três DMVs que você pode usar para rastrear o uso do tempdb:

Os dois primeiros permitirão rastrear alocações no nível de consulta e sessão. O terceiro rastreia as alocações no armazenamento de versão, no usuário e nos objetos internos.

A consulta de exemplo a seguir fornecerá alocações por sessão:

SELECT
  sys.dm_exec_sessions.session_id AS [SESSION ID]
  ,DB_NAME(database_id) AS [DATABASE Name]
  ,HOST_NAME AS [System Name]
  ,program_name AS [Program Name]
  ,login_name AS [USER Name]
  ,status
  ,cpu_time AS [CPU TIME (in milisec)]
  ,total_scheduled_time AS [Total Scheduled TIME (in milisec)]
  ,total_elapsed_time AS    [Elapsed TIME (in milisec)]
  ,(memory_usage * 8)      AS [Memory USAGE (in KB)]
  ,(user_objects_alloc_page_count * 8) AS [SPACE Allocated FOR USER Objects (in KB)]
  ,(user_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR USER Objects (in KB)]
  ,(internal_objects_alloc_page_count * 8) AS [SPACE Allocated FOR Internal Objects (in KB)]
  ,(internal_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR Internal Objects (in KB)]
  ,CASE is_user_process
             WHEN 1      THEN 'user session'
             WHEN 0      THEN 'system session'
  END         AS [SESSION Type], row_count AS [ROW COUNT]
FROM 
  sys.dm_db_session_space_usage
INNER join
  sys.dm_exec_sessions
ON  sys.dm_db_session_space_usage.session_id = sys.dm_exec_sessions.session_id

Se você deseja rastrear o uso por um período, considere coletar dados com sp_whoisactive , como demonstrado por Kendra Little .

Mark Storey-Smith
fonte
3
Obrigado. A diferença [SPACE Allocated FOR USER Objects (in KB)]e [SPACE Deallocated FOR USER Objects (in KB)]o espaço ocupado real da sessão são?
u23432534
4

Pode haver várias fontes de um problema:

  • uso de variáveis ​​de tabela ou tabelas temporárias
  • O servidor sql criou conjuntos de resultados intermediários como tabelas de trabalho no tempdb - geralmente para fins de classificação (geralmente é um sinal de índices ausentes / estatísticas desatualizadas)
  • O sql server decidiu pré-avaliar o conjunto de resultados da função com valor de tabela e, neste caso, armazena os dados no tempdb
  • recriando índices com opção SORT_IN_TEMPDB = ON
Oleg Dok
fonte