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

26

Die Tempdb eines Servers (SQL Server 2008) wird mehrmals monatlich auf über 500 GB erhöht. 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...sondern durch komplexe Verknüpfungen verursacht.

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 die Größenänderung / Verkleinerung der Dateien. Wie finde ich welche die tempdb halten?

u23432534
quelle
1
Es tut uns leid, dass es fast 2 Uhr morgens ist, und ich habe kein Benzin mehr, um diese Frage vollständig zu beantworten. Diese URLs können sich jedoch als nützlich erweisen, während Sie auf andere Antworten warten - mssqltips.com/sqlservertip/1432/… und google.com/search?q= welche + abfragen + verwenden + tempdb
Aaron Bertrand

Antworten:

27

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

Mit den ersten beiden können Sie die Zuordnungen auf Abfrage- und Sitzungsebene verfolgen. Der dritte Teil verfolgt die Zuordnungen über den Versionsspeicher, Benutzer und interne Objekte.

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 Kendra Little demonstriert hat .

Mark Storey-Smith
quelle
3
Vielen Dank. Ist der Unterschied [SPACE Allocated FOR USER Objects (in KB)]und [SPACE Deallocated FOR USER Objects (in KB)]der tatsächlich belegte Raum der Sitzung?
u23432534
4

Es kann verschiedene Ursachen für ein Problem geben:

  • Verwendung von Tabellenvariablen oder temporären Tabellen
  • sql server erstellte Zwischenergebnisse als Arbeitstabellen in tempdb - normalerweise zu Sortierzwecken (normalerweise ein Zeichen für fehlende Indizes / veraltete Statistiken)
  • sql server hat beschlossen, die Ergebnismenge der Tabellenwertfunktion vorab auszuwerten, und speichert in diesem Fall die Daten in tempdb
  • Indizes mit Option neu erstellen SORT_IN_TEMPDB = ON
Oleg Dok
quelle