Wissen

Praxis-Artikel und Buchkapitel zu SQL-Performance, Sicherheit und Hochverfügbarkeit – alle frei verfügbar.

Beratung

Festpreis-Analyse mit Bericht und Handlungsempfehlung – oder strategische Begleitung bei Architektur, Migration und Hochverfügbarkeit.

Fachbücher

Die fünfbändige Reihe „Ulis SQL-Bibliothek“ – Band 1 verfügbar. Leseprobe herunterladen!

Tools

UB.SimSQL: SQL-Server-Lastsimulator mit regelbasierten Konfigurationsempfehlungen. Lokal, ohne Cloud, ohne Abo.

Schulungen

Online-Workshops zu Performance, Sicherheit und Entwicklung – kompakt, hands-on, ohne MOC-Folienschlacht.

SQL Server tempdb konfigurieren

Die fünf Stellschrauben der gemeinsamen Arbeitsdatenbank – einmal richtig einstellen, dauerhaft profitieren.

Tempdb optimal konfigurieren

Wie viele Dateien, wie groß, auf welchem Storage? Die fünf Stellschrauben einer Wegwerf-Datenbank, an der der ganze Server hängt.

Es gibt in jedem SQL Server eine Datenbank, die niemandem gehört und an der trotzdem alle hängen: tempdb. Sie speichert nichts dauerhaft, wird bei jedem Neustart frisch erstellt und ist im Grunde eine große, gemeinschaftlich genutzte Kratzfläche — und genau deshalb wird sie so oft stiefmütterlich behandelt. „Ist doch nur die temporäre Datenbank“, denkt sich mancher, lässt die Standardkonfiguration aus der Installation stehen und wundert sich Jahre später, warum der Server unter Last seltsam zäh wird, obwohl CPU und Speicher Reserven zeigen. Die Wahrheit ist: tempdb ist das Schmiermittel der ganzen Instanz, und ein schlecht konfiguriertes Schmiermittel bremst die ganze Maschine.

Dieser Beitrag aus dem SQL-Server-Notarztwagen (die Triage-Übersicht liegt unter /sql-server-notarztwagen/) zeigt dir, wie du tempdb von Anfang an richtig aufstellst — fünf Stellschrauben, die zusammen darüber entscheiden, ob die gemeinsame Kratzfläche reibungslos läuft oder zum heimlichen Flaschenhals wird. Als Beitrag der GRÜN-Stufe geht es hier um die Konfiguration im Ruhezustand, die Probleme verhindert. Wer tempdb erst im Notfall anfasst — wenn sie volläuft oder unter Contention ächzt —, ist beim akuten tempdb-Beitrag der GELB-Stufe richtig; dieser hier sorgt dafür, dass es so weit gar nicht kommt.

Was tempdb ist — und warum sie alle angeht

Tempdb ist die eine, gemeinsame Arbeitsdatenbank einer SQL-Server-Instanz: Es gibt sie genau einmal, und jede Datenbank der Instanz teilt sie sich. In ihr passiert all das, wofür der Server kurzfristig Platz braucht und der nicht dauerhaft gespeichert werden muss: Sortierungen und Hash-Joins, die nicht in den Arbeitsspeicher passen und nach tempdb auslagern (die berüchtigten Spills), explizite temporäre Tabellen und Tabellenvariablen, der Version Store für Snapshot-Isolation und Online-Operationen, sowie diverse interne Zwischenergebnisse. Tempdb ist, kurz gesagt, der Werktisch, auf dem der Server alles ablegt, was er gerade in den Händen hat.

Aus dieser zentralen Rolle folgt die ganze Wichtigkeit der Konfiguration: Ist der Werktisch zu klein, zu langsam oder schlecht organisiert, trifft das nicht eine Datenbank, sondern alle. Eine zähe tempdb verlangsamt jede Sortierung jeder Abfrage jeder Anwendung auf dem Server gleichzeitig. Und weil tempdb bei jedem Start neu entsteht, ist ihre Konfiguration einer der wenigen Bereiche, in denen du mit ein paar bewussten Entscheidungen einmalig viel richtig machen kannst — ohne Backup-Sorgen, ohne Datenverlust-Risiko, denn es gibt schlicht nichts zu verlieren. Das ist ein angenehmer Sonderfall in der Welt der Datenbank-Konfiguration: Sonst hängt an fast jeder Änderung die bange Frage nach Wiederherstellbarkeit und Konsistenz — bei tempdb darfst du beherzt zugreifen, weil ein misslungener Versuch im schlimmsten Fall einen Neustart kostet und keine einzige Zeile produktiver Daten.

Die häufigste tempdb-Engstelle hat einen Namen: Allokations-Contention. Wenn viele Sessions gleichzeitig temporäre Objekte anlegen, drängeln sie sich um dieselben internen Verwaltungsseiten — PFS, GAM und SGAM —, die den freien Platz in einer Datei verwalten. Auf einer einzigen tempdb-Datei wird diese Verwaltung zum Nadelöhr, sichtbar als PAGELATCH-Wartezeiten (nicht zu verwechseln mit PAGEIOLATCH, dem Platten-Warten). Die elegante Lösung ist verblüffend simpel und der Kern der ganzen tempdb-Konfiguration: mehrere gleich große Dateien, über die sich die Verwaltungs-Last verteilt.

Abgrenzung: PAGELATCH vs. PAGEIOLATCH

PAGELATCH (ohne IO) — Warten auf eine Seite im Speicher, bei tempdb klassisch die Allokations-Contention auf PFS/GAM/SGAM. Lösung: mehr gleich große Dateien.
PAGEIOLATCH (mit IO) — Warten auf eine Seite von der Platte. Das ist ein Storage-/Speicher-Thema, nachzulesen im I/O-Latenz-Beitrag.
Ein Buchstabe Unterschied, zwei völlig verschiedene Baustellen — und tempdb-Contention ist fast immer die erste Variante.

Die fünf Stellschrauben

Eine gute tempdb-Konfiguration besteht aus fünf Entscheidungen, die zusammenwirken. Die folgende Übersicht ist die Konfigurations-Landkarte — von der Dateianzahl bis zum modernen Metadata-Feature:

Die Skripte: prüfen und konfigurieren

Schritt 1 — Den Ist-Zustand prüfen

Bevor du etwas änderst, der Blick auf die aktuelle Aufstellung: Wie viele Dateien gibt es, sind sie gleich groß, wie ist das Autogrow konfiguriert?

— Aktuelle tempdb-Dateikonfiguration

SELECT f.name AS Logischer_Name,

f.physical_name AS Pfad,

f.size * 8 / 1024 AS GroesseMB,

CASE f.is_percent_growth

WHEN 1 THEN CAST(f.growth AS varchar) + ' %'

ELSE CAST(f.growth * 8 / 1024 AS varchar) + ' MB'

END AS Autogrow,

f.type_desc AS Typ

FROM sys.master_files AS f

WHERE f.database_id = DB_ID(N'tempdb')

ORDER BY f.type_desc, f.file_id;

 

— Anzahl logischer CPU-Kerne (fuer die Dateianzahl-Faustregel)

SELECT cpu_count AS LogischeKerne FROM sys.dm_os_sys_info;

Die typischen Funde: nur eine Datendatei (Allokations-Contention vorprogrammiert), Dateien mit ungleicher Größe (Proportional Fill verteilt ungleich), oder ein Autogrow von 10 Prozent (das wird mit wachsender Datei immer gröber und ruckartiger). Stimmt einer dieser Punkte nicht, lohnt die Korrektur.

Schritt 2 — Auf Allokations-Contention prüfen

— Aktuelle Wartezeiten auf tempdb-Allokationsseiten (PFS/GAM/SGAM)

SELECT session_id, wait_type, wait_duration_ms, resource_description

FROM sys.dm_os_waiting_tasks

WHERE wait_type LIKE N'PAGELATCH%'

AND resource_description LIKE N'2:%'; — DB-ID 2 = tempdb

Zeilen mit PAGELATCH-Waits auf Ressourcen, die mit 2: beginnen (tempdb hat immer die Datenbank-ID 2), sind der direkte Nachweis von Allokations-Contention — die typischen Adressen sind 2:1:1 (PFS), 2:1:2 (GAM) und 2:1:3 (SGAM). Tauchen sie regelmäßig auf, ist die Dateianzahl die erste Stellschraube.

Schritt 3 — Dateien hinzufügen und gleich dimensionieren

— Vorhandene Datei vergroessern (alle gleich gross!)

ALTER DATABASE tempdb MODIFY FILE

(NAME = tempdev, SIZE = 4096MB, FILEGROWTH = 512MB);

 

— Zusaetzliche Datendatei hinzufuegen (gleiche Groesse/Growth)

ALTER DATABASE tempdb ADD FILE

(NAME = tempdev2, FILENAME = 'T:\tempdb\tempdev2.ndf',

SIZE = 4096MB, FILEGROWTH = 512MB);

 

— Hinweis: Strukturaenderungen werden erst nach Dienst-Neustart

— vollstaendig wirksam (tempdb wird dann neu erstellt).

Die Konfiguration im Detail

Storage: eigenes, schnelles Volume

Tempdb gehört auf das latenzärmste Storage, das du hast, und idealerweise auf ein eigenes Volume, getrennt von Daten- und Logdateien — denn sie konkurriert sonst um dieselbe I/O-Warteschlange. Ihr Zugriffsmuster (viele kleine, zufällige Lese- und Schreibvorgänge) ist genau das, was Flash und NVMe maximal belohnen. Der große Vorteil gegenüber jeder anderen Datenbank: tempdb muss weder gesichert noch hochverfügbar gehalten werden, weil sie bei jedem Start neu entsteht. Das macht sie zum idealen Kandidaten für schnelles lokales NVMe — sogar in einem Failover-Cluster, wo sie als einzige Datenbank nicht auf gemeinsamem Storage liegen muss. Diese Ausnahme ist ein häufig übersehener Performance-Hebel: Während die Nutzdatenbanken im Cluster zwingend auf dem gemeinsam erreichbaren Storage liegen müssen, damit sie beim Failover auf dem anderen Knoten verfügbar sind, gilt das für tempdb gerade nicht — sie wird auf dem Zielknoten ohnehin neu erstellt. Jeder Cluster-Knoten kann seine eigene tempdb auf schnellem lokalem NVMe halten, und genau das nimmt Last vom oft teureren, langsameren gemeinsamen Storage.

Trace Flags 1117/1118 — nur noch Geschichte (meistens)

Wer ältere Anleitungen liest, stößt unweigerlich auf die Empfehlung, die Trace Flags 1117 und 1118 zu setzen. Das war auf SQL Server 2014 und älter auch richtig: 1117 sorgte für gemeinsames Wachstum aller Dateien einer Gruppe, 1118 für uniforme Extents gegen Contention. Seit SQL Server 2016 ist dieses Verhalten für tempdb fest eingebaut — die Flags sind dort überflüssig und sollten nicht mehr gesetzt werden. Betreibst du noch eine ältere Version, gehören beide aktiviert; auf allem ab 2016 ist das Thema schlicht erledigt. Ein gutes Beispiel dafür, warum man Konfigurations-Tipps immer gegen die eigene Version prüfen sollte, statt sie blind zu übernehmen.

Memory-Optimized Metadata — die letzte Engstelle

Selbst mit perfekter Dateianzahl blieb lange eine tempdb-Engstelle bestehen: die Contention auf den Metadaten, also den internen Systemtabellen, die temporäre Objekte verwalten. Bei Workloads, die massenhaft kurzlebige temporäre Tabellen erzeugen, wurde diese Verwaltung selbst zum Nadelöhr. Seit SQL Server 2019 löst das Feature Memory-Optimized Tempdb Metadata das Problem, indem es diese Systemtabellen in latch-freie, speicheroptimierte Strukturen verlegt. Aktiviert per ALTER SERVER CONFIGURATION und einem Neustart, ist es bei sehr hoher tempdb-Last oft der entscheidende Schritt — bei moderater Last dagegen unnötig, und es gibt einige Einschränkungen (etwa bei bestimmten Operationen über speicheroptimierte Tabellen). Ein Feature für die gezielte Anwendung, nicht für die Gießkanne.

Was du auf keinen Fall tun solltest

  • Nicht: Die Standardkonfiguration aus der Installation einfach stehen lassen. Auf älteren Versionen bedeutet das eine einzige Datendatei und damit programmierte Allokations-Contention. Seit 2016 schlägt das Setup zwar Besseres vor — aber prüfen statt vertrauen ist die DBA-Tugend.
  • Nicht: tempdb-Dateien ungleich groß machen. Der Proportional-Fill-Algorithmus bevorzugt die größte Datei und schreibt unverhältnismäßig viel in sie hinein — genau das, was die Verteilung auf mehrere Dateien verhindern soll. Gleiche Größe ist keine Schönheit, sondern Funktion.
  • Nicht: Auf prozentuales Autogrow setzen. 10 Prozent von einer kleinen Datei ist ein kleiner Schritt, 10 Prozent von einer riesigen ein gewaltiger — das Wachstum wird mit der Zeit immer ruckartiger und unvorhersehbarer. Feste MB-Schritte sind planbar.
  • Nicht: tempdb klein dimensionieren und auf Autogrow vertrauen. Jedes Wachstum unter Last kann zu Wartezeiten führen. Vorab auf die realistische Last dimensionieren und Autogrow nur als Sicherheitsnetz — nicht als Wachstumsplan.
  • Die drei häufigsten Anfängerfehler

    1. Mehr Dateien für besser halten und gleich 32 anlegen. Über acht hilft nur bei nachgewiesener Rest-Contention — sonst schafft die Überzahl neue Verwaltungs-Last statt sie zu lösen.
    2. PAGELATCH und PAGEIOLATCH verwechseln. Das eine ist tempdb-Contention (mehr Dateien), das andere ein Storage-Thema (schnelleres Volume) — die falsche Diagnose führt zur falschen Lösung.
    3. Trace Flags aus alten Anleitungen blind auf moderne Versionen übernehmen. 1117/1118 sind seit 2016 überflüssig — Tipps gehören gegen die eigene Version geprüft.

    Tempdb-Konfiguration in der Routine

    Tempdb richtig aufzustellen ist überwiegend eine einmalige Aufgabe — einmal sauber konfiguriert, läuft sie. Drei Punkte gehören trotzdem in die laufende Pflege: Erstens, die tempdb-Konfiguration in den Health Check aufnehmen — Dateianzahl, gleiche Größe und Autogrow gehören zu den Konfigurationswerten, die ein guter Selbsttest mitprüft. Zweitens, Autogrow-Ereignisse überwachen: Wächst tempdb im Betrieb regelmäßig, ist die Grunddimensionierung zu klein und gehört nach oben korrigiert. Drittens, bei jedem Hardware-Wechsel die Kernzahl neu bewerten — eine Maschine mit mehr Kernen kann von mehr tempdb-Dateien profitieren, und die Dateianzahl wandert beim Umzug nicht automatisch mit. Wie tempdb in das größere Bild der proaktiven Wartung passt, zeigt der Health-Check-Beitrag der GRÜN-Stufe.

    Vertiefung in der Buchreihe

    Tempdb-Architektur, Allokations-Mechanik und die Konfigurations-Feinheiten füllen in der Buchreihe „SQL Server in der Praxis“ ein eigenes Kapitel — alle Bände in der Übersicht auf der SQL-Pillar-Seite unter /sql-server/.

    Empfohlener Band

    Band 1: Performance & Troubleshooting — das Heimatbuch dieses Beitrags: tempdb von der Architektur bis zur Konfiguration, Allokations-Contention und ihre Diagnose, der Version Store, Memory-Optimized Metadata und die Storage-Strategie — plus die Abgrenzung zu allen tempdb-Symptomen, die im laufenden Betrieb auftreten können.

    Verwandte Beiträge im Notarztwagen

    Tempdb-Konfiguration hat enge Nachbarn — diese Beiträge aus dem Cluster lohnen den Blick:

  • Tempdb-Probleme — voll, langsam oder Contention (/sql-server-tempdb-probleme/) — die akute GELB-Seite: was zu tun ist, wenn tempdb im laufenden Betrieb ächzt, statt sie im Ruhezustand richtig aufzustellen.
  • I/O-Latenz hoch (/sql-server-io-latenz/) — für die Storage-Seite: warum tempdb das schnellste Volume verdient und wie man Latenz misst.
  • SQL Server Health Check (/sql-server-health-check/) — der Selbsttest, in dem die tempdb-Konfiguration ihren festen Platz hat.
  • Wait Stats interpretieren (/sql-server-wait-stats/) — der Kompass, der PAGELATCH-Contention von anderen Engpässen unterscheidet.
  • Drei Wege zur richtig konfigurierten tempdb

    Selbst-Diagnose-Kit

    Tempdb-Konfiguration ist die klassische Selbstmach-Aufgabe mit großem Hebel — und genau dafür gibt es das Diagnose-Kit. Es bündelt die Skripte aus diesem Beitrag — Ist-Zustand der Dateien, Contention-Nachweis, Konfigurations-Vorlagen für Dateianzahl und Größe — plus die Fünf-Stellschrauben-Checkliste zum Ausdrucken und einen Dateianzahl-Rechner auf Basis deiner Kernzahl. Damit stellst du tempdb in einem Wartungsfenster ein für alle Mal richtig auf.

    Festpreis-Analyse

    Dein Server wird unter Last zäh, obwohl CPU und Speicher Reserven zeigen, und du vermutest tempdb als heimlichen Flaschenhals? Die Festpreis-Analyse schafft Klarheit: Ich prüfe die komplette tempdb-Aufstellung gegen die aktuelle Workload — Dateianzahl, Größe, Storage, Contention-Nachweis, Versions-Features — und liefere einen Bericht mit konkreter Soll-Konfiguration und priorisierten Maßnahmen. Zum vereinbarten Festpreis, ohne Stundenzähler.

    Akut-Hotline

    Wenn tempdb gerade jetzt zum Problem geworden ist — volläuft oder unter Contention den ganzen Server lähmt: anrufen. Halte einen Zugang mit den nötigen Rechten bereit und die Kernzahl der Maschine. Meist lässt sich die akute Lage entschärfen und die saubere Konfiguration danach ins nächste Wartungsfenster legen.

    Ein letzter Tipp

    Führe diese Woche die erste Abfrage dieses Beitrags aus und vergleiche zwei Zahlen: wie viele tempdb-Datendateien dein Server hat — und wie viele CPU-Kerne. Wenn dort eine einzige Datei auf einer Maschine mit acht oder mehr Kernen steht, hast du gerade den lohnendsten Konfigurations-Fix deines Quartals gefunden: ein paar gleich große Dateien hinzufügen, einmal neu starten, und eine stille Bremse ist gelöst — ganz ohne neue Hardware.

    Häufige Fragen (FAQ)

    Diese Sektion ist auf häufige Suchanfragen abgestimmt. Sie hilft dir, schnell den Punkt zu finden, der dir gerade akut weiterhilft — und sie ist gleichzeitig die Eingabe für das FAQPage-Schema auf der Seite.

    Wie viele tempdb-Dateien sollte ich anlegen?

    Die etablierte Faustregel: eine Datendatei je CPU-Kern bis maximal acht. Hat der Server acht oder weniger Kerne, also je Kern eine Datei; hat er mehr, startest du trotzdem mit acht und erhöhst nur dann in Vierer-Schritten, wenn die Allokations-Contention nachweisbar bestehen bleibt. Der Grund für mehrere Dateien ist nicht mehr Platz, sondern weniger Contention: Die Systemseiten zur Speicherverwaltung (PFS, GAM, SGAM) liegen je Datei getrennt vor, sodass parallele Zugriffe sich auf mehrere Dateien verteilen statt sich auf einer zu drängeln. Seit SQL Server 2016 schlägt das Setup während der Installation bereits eine sinnvolle Anzahl vor.

    Wie groß sollte tempdb sein?

    Groß genug, dass sie im Normalbetrieb nicht wachsen muss — denn jedes Autogrow-Ereignis kostet Zeit und kann unter Last zu Wartezeiten führen. Statt klein zu starten und den Server wachsen zu lassen, dimensionierst du tempdb vorab auf die Größe, die deine Arbeitslast realistisch braucht, und lässt Autogrow nur als Sicherheitsnetz aktiviert. Die richtige Größe ermittelst du durch Beobachtung über einen vollen Lastzyklus inklusive der großen Monats- und Quartalsläufe. Wichtig: Alle Dateien müssen exakt gleich groß sein, sonst verteilt der Proportional-Fill-Algorithmus die Last ungleich und der Effekt mehrerer Dateien verpufft.

    Was bewirken Trace Flag 1117 und 1118?

    Diese beiden Trace Flags steuerten früher zwei wichtige tempdb-Verhaltensweisen: 1117 sorgte dafür, dass alle Dateien einer Dateigruppe gemeinsam wachsen (damit sie gleich groß bleiben), und 1118 erzwang die Verwendung uniformer Extents statt gemischter (was Allokations-Contention reduziert). Seit SQL Server 2016 ist dieses Verhalten für tempdb fest eingebaut und Standard — die Trace Flags sind dort also überflüssig. Relevant sind sie nur noch, wenn du eine ältere Version als 2016 betreibst; dann gehören beide gesetzt. Auf modernen Versionen ist das Thema schlicht erledigt, was die tempdb-Konfiguration deutlich vereinfacht hat.

    Was ist Memory-Optimized tempdb Metadata?

    Ein Feature seit SQL Server 2019, das die internen Systemtabellen von tempdb (die Metadaten) in speicheroptimierte, latch-freie Strukturen verlegt. Damit verschwindet die Metadaten-Contention — die letzte große tempdb-Engstelle, die selbst mit optimaler Dateianzahl bestehen blieb, weil sie nicht die Datenseiten, sondern die Verwaltungstabellen betraf. Aktiviert wird es per ALTER SERVER CONFIGURATION mit anschließendem Neustart. Sinnvoll ist es bei sehr hoher tempdb-Last mit massenhaft temporären Objekten; bei moderater Last bringt es wenig und es gibt einige Einschränkungen zu beachten. Für hoch belastete OLTP-Systeme ist es aber oft der entscheidende Schritt.

    Auf welchem Storage gehört tempdb?

    Auf das schnellste, latenzärmste Storage, das verfügbar ist — idealerweise ein eigenes, von Daten- und Logdateien getrenntes Flash- oder NVMe-Volume. Tempdb hat ein I/O-Profil, das Flash maximal belohnt: viele kleine, zufällige Zugriffe durch Sortierungen, Spills und den Version Store. Eine Besonderheit macht die Storage-Wahl einfacher als bei anderen Datenbanken: Tempdb wird bei jedem Dienststart komplett neu erstellt und muss weder gesichert noch repliziert werden. Deshalb ist selbst in einem Failover-Cluster lokales NVMe für tempdb unkritisch und oft die beste Wahl — sie muss beim Failover nicht mitwandern.

    Sollte tempdb autogrow aktiviert haben?

    Ja, aber nur als Sicherheitsnetz, nicht als Wachstumsstrategie. Die Idee ist, tempdb vorab groß genug zu dimensionieren, dass sie im Normalbetrieb nie wachsen muss — und Autogrow nur für den Ausnahmefall aktiviert zu lassen, damit eine unerwartete Lastspitze die Instanz nicht zum Stillstand bringt. Wenn Autogrow greift, sollte der Zuwachs in festen, ausreichend großen Schritten erfolgen (kein winziger Prozentwert), und alle Dateien müssen mit identischem Autogrow konfiguriert sein, damit sie gleich groß bleiben. Häufige Autogrow-Ereignisse im Betrieb sind ein Warnsignal: Dann ist die Grunddimensionierung zu klein gewählt.

    Wie verschiebe ich tempdb auf andere Dateien?

    Über ALTER DATABASE tempdb MODIFY FILE mit dem neuen Pfad je Datei — die Änderung wird aber erst beim nächsten Dienstneustart wirksam, weil tempdb dann ohnehin neu erstellt wird. Der Ablauf: neuen Pfad per ALTER DATABASE setzen, SQL-Dienst neu starten, prüfen ob tempdb am neuen Ort liegt, dann die alten Dateien entfernen. Über denselben Mechanismus änderst du auch die Anzahl der Dateien (neue per ADD FILE hinzufügen) oder ihre Größe. Da jede Strukturänderung an tempdb einen Neustart braucht, plant man sie sinnvollerweise gebündelt in ein Wartungsfenster — einmal richtig statt mehrfach neu starten.