Führen Schreibvorgänge in TempDB immer zu einem tatsächlichen physischen Schreibvorgang auf die Festplatte, oder werden TempDB-Schreibvorgänge für verzögertes Schreiben von SQL Server zwischengespeichert, wie im Windows-Dateisystemcache?
Tun sie immer Ganz bestimmt nicht. Haben sie jemals? Ja, aber nicht aufgrund des typischen Mechanismus. Die Referenz hier ist Was macht Checkpoint für Tempdb? .
In einem "gut verhaltenen" System werden Schreibvorgänge in eine Benutzerdatenbankdatei am Prüfpunkt ausgeführt. In einem schlecht verhaltenen System treten Schreibvorgänge auch auf, wenn der Lazywriter Seiten aus dem Pufferpool leeren muss, um Platz für andere Seiten zu schaffen.
Ein Prüfpunkt wird nur für Tempdb ausgeführt, wenn die Tempdb-Protokolldatei zu 70% voll ist. Dies soll verhindern, dass das Tempdb-Protokoll wächst, wenn dies überhaupt möglich ist , genau wie in einer Benutzerdatenbank).
Es ist jedoch nicht erforderlich, tempdb auf die Festplatte zu kopieren, da die Wiederherstellung nach einem Absturz niemals auf tempdb ausgeführt wird und beim Start immer neu erstellt wird.
Tempdb wird im Falle eines Absturzes nicht wiederhergestellt, so dass es nicht erforderlich ist, fehlerhafte Tempdb-Seiten auf die Festplatte zu zwingen, es sei denn, der Lazywriter-Prozess (Teil des Pufferpools) muss Platz für Seiten aus anderen Datenbanken schaffen.
Dies ist bemerkenswert (es war eine Überraschung für mich) der einzige Mechanismus, mit dem Tempdb-Seiten auf die Festplatte geschrieben werden. Wenn Pufferpooldruck vorhanden ist, werden Tempdb-Seiten möglicherweise auf die Festplatte gespült. Wenn nicht, sollte es nicht auftreten.
Bearbeiten: Es ist fraglich, ob "schlechtes Benehmen" eine angemessene Beschreibung für eine Benutzerdatenbank ist, die Seiten außerhalb des Prüfpunkts schreibt. Ungewöhnlich, untypisch oder einfach nicht ideal?
Zusätzliche Bearbeitung (folgende Kommentare / Chat mit @PaulWhite):
Die offensichtliche Lücke oben ist, dass temporäre Tabellen nicht die einzige Quelle für temporären Datenverkehr sind. Zitate aus dem Verständnis von Hash-, Sortier- und Exchange- Überlaufereignissen :
Bestimmte SQL Server-Abfrageausführungsvorgänge werden kalibriert, um die beste Leistung zu erzielen, indem (etwas) viel Speicher als Zwischenspeicher verwendet wird. Das Abfrageoptimierungsprogramm wählt einen Plan aus und schätzt die Kosten basierend auf diesen Operatoren mithilfe dieses Arbeitsspeicher-Notizblocks. Dies ist natürlich nur eine Schätzung. Bei der Ausführung können sich die Schätzungen als falsch herausstellen, und der Plan muss fortgesetzt werden, obwohl nicht genügend Speicher vorhanden ist. In einem solchen Fall werden diese Operatoren auf die Festplatte übertragen.
Ich hatte fälschlicherweise angenommen, dass der Mechanismus hinter einem physischen Schreibvorgang für eine Überlaufoperation genau derselbe war, wie zuvor beschrieben, dh der Lazywriter zwang tempdb-Seiten aufgrund von Druck auf den Pufferpool (verursacht durch den Überlauf) auf den Datenträger.
@PaulWhite hat erklärt, wo ich mich geirrt habe (danke Paul!):
Ich glaube, Sie fragen sich, warum physische Tempdb-Aktivitäten auftreten, wenn eine Abfrage die Speicherzuweisung für den Arbeitsbereich überschreitet, anstatt nur Tempdb-in-Memory zu verwenden. In diesem Fall würde die Abfrage mehr Speicher als die Zuweisung belegen und damit den Speicher einschränken Zuschüsse in erster Linie.
Verschüttetes ist in der Tat etwas Besonderes, wenn es bis zur Aufbewahrung geschrieben wird. Die physische Tempdb-Aktivität ist selbst angesichts der Unmengen an freiem Speicher und des Null-Drucks auf Tempdb auffällig.
Paul hat mich auch auf seinen Blog-Beitrag Advanced TSQL Tuning: Why Internals Knowledge Matters hingewiesen, der Beispielskripte zur Veranschaulichung von Verschüttungen für diejenigen enthält, die sich eingehender mit dem Thema befassen möchten.