it-swarm.com.de

Wie finde ich die SQL-Anweisungen, die das Wachstum von Tempdb verursacht haben?

Die Tempdb eines Servers (SQL Server 2008) erhöht sich mehrmals im Monat auf über 500 GB. Ist es möglich herauszufinden, welche SQL-Anweisungen dieses Problem verursacht haben? Das Problem wird normalerweise nicht durch create table #temp...; insert into #temp... Oder select ... into #temp... Verursacht, sondern durch komplexe Verknüpfungen.

Die Anfangsgröße einiger Tempdb-Dateien wird jedes Mal automatisch auf viel größere Werte gesetzt. Wie kann man das verhindern?

Manchmal verhindern die zwischengespeicherten Pläne das Ändern/Verkleinern der Dateien. Wie finde ich heraus, welcher die Tempdb hält?

26
u23432534

Es gibt drei DMVs, mit denen Sie die Tempdb-Nutzung verfolgen können:

Mit den ersten beiden können Sie Zuordnungen auf Abfrage- und Sitzungsebene verfolgen. Der dritte Teil verfolgt die Zuordnungen zwischen Versionsspeicher, Benutzer und internen Objekten.

Die folgende Beispielabfrage gibt Ihnen Zuordnungen pro Sitzung:

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

Wenn Sie die Nutzung über einen bestimmten Zeitraum verfolgen möchten, sollten Sie Daten mit sp_whoisactive erfassen, wie von Kendra Little gezeigt.

27

Es kann verschiedene Ursachen für ein Problem geben:

  • verwendung von Tabellenvariablen oder temporären Tabellen
  • sQL Server hat Zwischenergebnisse als Arbeitstabellen in Tempdb erstellt - normalerweise zu Sortierzwecken (normalerweise ein Zeichen für fehlende Indizes/veraltete Statistiken).
  • der SQL Server hat beschlossen, die Ergebnismenge der Tabellenwertfunktion vorab auszuwerten. In diesem Fall werden die Daten in Tempdb gespeichert
  • indizes mit Option SORT_IN_TEMPDB = ON neu erstellen
4
Oleg Dok