Comment trouver les instructions SQL qui ont provoqué la croissance de tempdb?

26

La tempdb d'un serveur (SQL Server 2008) augmente à 500 Go + plusieurs fois par mois. Est-il possible de savoir quelles instructions SQL ont provoqué ce problème? Le problème n'est généralement pas causé par create table #temp...; insert into #temp...ou select ... into #temp...mais par des jointures complexes.

La taille initiale de certains fichiers tempdb est également automatiquement définie à des valeurs beaucoup plus importantes à chaque fois. Comment l'empêcher?

Parfois, les plans mis en cache empêchent le redimensionnement / la réduction des fichiers. Comment trouver lequel détient le tempdb?

u23432534
la source
1
Désolé, il est presque 2 heures du matin et je n'ai plus d'essence pour répondre complètement à cette question, mais ces URL peuvent être utiles pendant que vous attendez d'autres réponses - mssqltips.com/sqlservertip/1432/… et google.com/search?q= quelles + requêtes + utilisent + tempdb
Aaron Bertrand

Réponses:

27

Il existe trois DMV que vous pouvez utiliser pour suivre l'utilisation de tempdb:

Les deux premiers vous permettront de suivre les allocations au niveau de la requête et de la session. Le troisième suit les allocations entre le magasin de versions, l'utilisateur et les objets internes.

L'exemple de requête suivant vous donnera des allocations par session:

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 vous souhaitez suivre l'utilisation sur une période de temps, envisagez de collecter des données avec sp_whoisactive , comme l'a démontré Kendra Little .

Mark Storey-Smith
la source
3
Merci. Est-ce la différence [SPACE Allocated FOR USER Objects (in KB)]et [SPACE Deallocated FOR USER Objects (in KB)]l'espace réellement occupé de la session?
u23432534
4

Il peut y avoir différentes sources de problème:

  • utilisation de variables de table ou de tables temporaires
  • Le serveur SQL a créé des jeux de résultats intermédiaires en tant que tables de travail dans tempdb - généralement à des fins de tri (est généralement un signe d'index absents / de statistiques obsolètes)
  • Le serveur SQL a décidé de pré-évaluer l'ensemble de résultats de la fonction de valeur de table et dans ce cas, il stocke les données dans tempdb
  • recréation d'index avec option SORT_IN_TEMPDB = ON
Oleg Dok
la source