Come trovare le istruzioni SQL che hanno causato la crescita di tempdb?


26

Il tempdb di un server (SQL Server 2008) aumenta fino a 500 GB + più volte al mese. È possibile scoprire quali istruzioni SQL hanno causato questo problema? Il problema di solito non è causato da create table #temp...; insert into #temp...o select ... into #temp...ma join complessi.

Anche la dimensione iniziale di alcuni dei file tempdb viene automaticamente impostata su valori molto più grandi ogni volta. Come prevenirlo?

A volte i piani memorizzati nella cache impediscono il ridimensionamento / la riduzione dei file. Come trovare quale contiene il tempdb?


1
Siamo spiacenti, sono quasi le 2 del mattino e sono senza benzina per rispondere completamente a questa domanda, tuttavia questi URL potrebbero tornare utili mentre aspetti altre risposte - mssqltips.com/sqlservertip/1432/… e google.com/search?q= quali + query + sono + utilizzando + tempdb
Aaron Bertrand

Risposte:


27

Esistono tre DMV che è possibile utilizzare per tenere traccia dell'utilizzo di tempdb:

I primi due ti permetteranno di tracciare le allocazioni a livello di query e sessione. Il terzo tiene traccia delle allocazioni attraverso l'archivio versione, l'utente e gli oggetti interni.

La seguente query di esempio fornisce allocazioni per sessione:

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 vuoi tenere traccia dell'utilizzo per un periodo di tempo, considera la raccolta di dati con sp_whoisactive , come dimostrato da Kendra Little .


3
Grazie. La differenza è [SPACE Allocated FOR USER Objects (in KB)]e [SPACE Deallocated FOR USER Objects (in KB)]lo spazio occupato effettivo della sessione?
u23432534,

4

Possono esserci varie fonti di un problema:

  • utilizzo di variabili di tabella o tabelle temporanee
  • Il server sql ha creato set di risultati intermedi come tabelle di lavoro in tempdb, generalmente per scopi di ordinamento (di solito è un segno di indici assenti / statistiche non aggiornate)
  • Il server sql ha deciso di pre-valutare il set di risultati della funzione con valori di tabella e in questo caso memorizza i dati in tempdb
  • ricreare gli indici con l'opzione SORT_IN_TEMPDB = ON
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.