¿Cómo encontrar las declaraciones SQL que causaron el crecimiento de tempdb?

26

La tempdb de un servidor (SQL Server 2008) aumenta a 500 GB + varias veces al mes. ¿Es posible averiguar qué sentencias SQL causaron este problema? El problema generalmente no es causado por create table #temp...; insert into #temp...o select ... into #temp...sino uniones complejas.

los tamaño inicial de algunos de los archivos tempdb también se establece automáticamente en valores mucho mayores cada vez. ¿Cómo prevenirlo?

En algún momento, los planes en caché evitan cambiar el tamaño / reducir los archivos. ¿Cómo encontrar cuál tiene el tempdb?

u23432534
fuente
1
Lo siento, son casi las 2 de la madrugada y no puedo responder esta pregunta por completo, sin embargo, estas URL pueden ser útiles mientras espera otras respuestas: mssqltips.com/sqlservertip/1432/… y google.com/search?q= que + consultas + están + usando + tempdb
Aaron Bertrand

Respuestas:

27

Hay tres DMV que puede usar para rastrear el uso de tempdb:

Los dos primeros le permitirán realizar un seguimiento de las asignaciones a nivel de consulta y sesión. El tercero rastrea las asignaciones en el almacén de versiones, el usuario y los objetos internos.

La siguiente consulta de ejemplo le dará asignaciones por sesión:

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

Si desea realizar un seguimiento del uso durante un período de tiempo, considere recopilar datos con sp_whoisactive , como lo demostró Kendra Little .

Mark Storey-Smith
fuente
3
Gracias. ¿Es la diferencia [SPACE Allocated FOR USER Objects (in KB)]y [SPACE Deallocated FOR USER Objects (in KB)]el espacio ocupado real de la sesión?
u23432534
4

Puede haber varias fuentes de un problema:

  • uso de variables de tabla o tablas temporales
  • el servidor sql creó conjuntos de resultados intermedios como tablas de trabajo en tempdb, generalmente para fines de clasificación (generalmente es un signo de índices ausentes / estadísticas desactualizadas)
  • El servidor SQL decidió evaluar previamente el conjunto de resultados de la función con valores de tabla y, en este caso, almacena los datos en tempdb
  • recreando índices con opción SORT_IN_TEMPDB = ON
Oleg Dok
fuente