web-dev-qa-db-fra.com

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

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 jointures complexes.

Taille initiale de certains fichiers tempdb est également automatiquement réglé sur des valeurs beaucoup plus grandes à chaque fois. Comment l'empêcher?

Parfois, les plans mis en cache empêchent de redimensionner/réduire les fichiers. Comment trouver lequel détient le tempdb?

26
u23432534

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 le montre Kendra Little .

27
Mark Storey-Smith

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 le signe d'index absents/de statistiques obsolètes)
  • sQL Server 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 l'option SORT_IN_TEMPDB = ON
4
Oleg Dok