Wie behandelt SQL Server die Daten für eine Abfrage, bei der nicht genügend Speicherplatz im Puffercache vorhanden ist?


10

Meine Frage ist, wie SQL Server mit einer Abfrage umgeht, die mehr Datenvolumen in den Puffercache ziehen muss, als Speicherplatz verfügbar ist. Diese Abfrage würde mehrere Verknüpfungen enthalten, sodass die Ergebnismenge in diesem Format noch nicht auf der Festplatte vorhanden ist und die Ergebnisse kompiliert werden müssten. Aber auch nach der Kompilierung wird immer noch mehr Speicherplatz benötigt, als im Puffercache verfügbar ist.

Ich werde ein Beispiel geben. Angenommen, Sie haben eine SQL Server-Instanz mit insgesamt 6 GB Puffer-Cache-Speicherplatz. Ich führe eine Abfrage mit mehreren Verknüpfungen aus, die 7 GB Daten liest. Wie kann SQL Server auf diese Anforderung antworten? Speichert es die Daten vorübergehend in Tempdb? Scheitert es? Tut es etwas, das nur Daten von der Festplatte liest und Segmente gleichzeitig kompiliert?

Was passiert außerdem, wenn ich versuche, 7 GB Gesamtdaten zurückzugeben? Ändert sich dadurch, wie SQL Server damit umgeht?

Ich kenne bereits mehrere Möglichkeiten, um dies zu beheben. Ich bin nur gespannt, wie SQL Server diese Anforderung intern verarbeitet, wenn sie wie angegeben ausgeführt wird.

Ich bin mir auch sicher, dass diese Informationen irgendwo vorhanden sind, aber ich konnte sie nicht finden.


1
In Laienbegriffen speichert SQL Server die Arbeitstabellen und Ergebnisse seiner eigenen internen Verarbeitung in tempdb. Die Seiten werden bei Bedarf von der Festplatte gelesen. Seiten bleiben im Speicher, bis sie erzwungen werden oder wenn SQL bereit ist, sie auf die Festplatte zu übertragen. In diesem Fall wächst eine große Abfragetempdb. Ich habe gesehen, dass Abfragen ein System in die Knie gezwungen haben, weil Tempdb unkontrolliert wachsen durfte und den gesamten verbleibenden Speicherplatz auf dem Laufwerk verbrauchte. Ich weiß, dass dies nicht 100% genau ist, ich versuche es nur einfach zu erklären. Der Teil, der die Daten verwendet, ist nicht der Teil, der den Speicherort dieser Daten verwaltet
Datagod

Antworten:


13

Seiten werden nach Bedarf in den Speicher eingelesen. Wenn kein freier Speicher verfügbar ist, wird die älteste nicht geänderte Seite durch die eingehende Seite ersetzt.

Wenn Sie also eine Abfrage ausführen, für die mehr Daten erforderlich sind, als in den Speicher passen, haben viele Seiten eine sehr kurze Lebensdauer im Speicher, was zu vielen E / A führt.

Sie können diesen Effekt sehen, indem Sie den Zähler "Page Life Expectancy" im Windows Performance Monitor anzeigen. Unter https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancy finden Sie einige wichtige Details zu diesem Zähler.

In den Kommentaren haben Sie speziell gefragt, was passiert, wenn die Ergebnisse der Abfrage größer als der verfügbare Pufferplatz sind. Nehmen Sie das einfachste Beispiel: Nehmen Sie select * from some_very_big_table;an, die Tabelle hat 32 GB und max server memory (MB)ist auf 24 GB konfiguriert. Alle 32 GB Tabellendaten werden in die Seiten in den Seitenpuffer einer nach dem anderen gelesen werden, verriegelt, in Netzwerkpakete formatiert und über das Kabel gesendet. Dies geschieht Seite für Seite; Es könnten 300 solcher Abfragen gleichzeitig ausgeführt werden. Unter der Annahme, dass keine Blockierung stattgefunden hat, werden die Daten für jede Abfrage Seite für Seite in den Seitenpufferbereich eingelesen und so schnell wie möglich auf den Draht gelegt Daten anfordern und verbrauchen. Sobald alle Daten von jeder Seite auf die Leitung gesendet wurden, wird die Seite entriegelt und sehr schnell durch eine andere Seite von der Festplatte ersetzt.

Bei einer komplexeren Abfrage, beispielsweise beim Aggregieren von Ergebnissen aus mehreren Tabellen, werden Seiten genau wie oben beschrieben in den Speicher gezogen, wie sie vom Abfrageprozessor benötigt werden. Wenn der Abfrageprozessor temporären Arbeitsbereich benötigt, um die Ergebnisse zu berechnen, weiß er dies im Voraus, wenn er einen Plan für die Abfrage erstellt, und fordert Arbeitsbereich (Speicher) von SQLOS an . SQLOS wird irgendwann (vorausgesetzt, es tritt keine Zeitüberschreitung auf ) dem Abfrageprozessor diesen Speicher gewähren. Ab diesem Zeitpunkt wird die Abfrageverarbeitung fortgesetzt . Wenn der Abfrageprozessor einen Fehler bei der Schätzung macht, wie viel Speicher von SQLOS angefordert werden muss, muss er möglicherweise einen "Spill to Disk" durchführen.Operation, bei der Daten vorübergehend in einer Zwischenform in Tempdb geschrieben werden. Die Seiten, die in Tempdb geschrieben wurden, werden entsperrt, sobald sie in Tempdb geschrieben wurden, um Platz für das Einlesen anderer Seiten in den Speicher zu schaffen. Schließlich kehrt der Abfrageprozess zu den in tempdb gespeicherten Daten zurück und paginiert diese bei Verwendung von Latching in Seiten im Puffer, die als frei markiert sind.

Ich vermisse zweifellos eine Menge sehr technischer Details in der obigen Zusammenfassung, aber ich denke, das erfasst die Essenz, wie SQL Server mehr Daten verarbeiten kann, als in den Speicher passen.


Welche Art von Abfrage zieht aus Neugier 7 GB Daten? Ich hoffe, das ist ein Batch-Prozess.
Datum

Wahrscheinlich nicht viele und Sie haben Recht, es wäre hoffentlich ein Batch-Prozess. Ich war nur neugierig zu sehen, wie SQL mit dieser Anfrage umgehen würde
Dustin

5

Ich kann nicht genau sagen, was Ihre Abfrage in diesem Szenario tun würde, aber SQL Server bietet verschiedene Optionen, je nachdem, wie viel benötigt wird.

  • Daten können in TempDB "verschüttet" werden, dies würde Ihre Festplatte verwenden
  • Alte Seiten können aus Ihrem Puffercache verschoben werden
  • SQL Server kann einige Seiten laden, um den Cache zu puffern, sie verwenden und dann neue Seiten einblenden

Der beste Weg, um herauszufinden, was passieren würde, besteht darin, das Szenario in einer Entwicklungsumgebung zu erstellen und herauszufinden.


2

Meine Frage ist, wie SQL Server mit einer Abfrage umgeht, die mehr Datenvolumen in den Puffercache ziehen muss, als Speicherplatz verfügbar ist

Um diesen speziellen Teil zu beantworten, möchte ich Ihnen sagen, wie dies verwaltet wird. Die Seiten haben eine Größe von 8 KB. Wenn Sie eine Abfrage ausführen, die einen großen Datensatz anfordert und für die zahlreiche Seiten in den Speicher gebracht werden müssen, werden von SQL Server nicht alle Seiten auf einmal abgerufen. Es wird die spezifischen Seiten lokalisieren und eine einzelne 8-KB-Seite nacheinander in den Speicher bringen. Lesen Sie die Daten daraus heraus und geben Sie das Ergebnis an. Dies wird nun fortgesetzt, wenn es sich um eine Situation handelt, in der weniger Speicher vorhanden ist. In diesem Fall werden alte Seiten gelöscht die Scheibe wie @Max wies darauf hin. Wie Sie richtig erraten haben, kann dieser geringe Speicher die Dinge verlangsamen, da einige Zeit für das Entfernen alter Seiten aufgewendet werden würde. Hier Checkpoint und Lazywriterkommt ins Bild. Lazywriter sorgt dafür, dass immer freier Speicher vorhanden ist, um neue Seiten auf die Festplatte zu bringen. Wenn ein niedriger freier Puffer angetroffen wird, wird dieser ausgelöst und es werden freie Speicherplätze für neue Seiten erstellt.

BEARBEITEN

Ich verstehe das, aber der Teil, der mich ein bisschen verblüfft, ist, was passiert, wenn Sie Daten zusammenfügen und filtern und diese Ergebnisse die Größe des Caches überschreiten.

Der Speicher für das Zusammenfügen und Filtern wird bereits vor der Ausführung der Abfrage festgelegt. Angenommen, es liegt tatsächlich eine Speicherverknappung vor, und der für die Ausführung des Vorgangs erforderliche Speicher ist nicht verfügbar. Der SQL Server-Prozessor gewährt "erforderlichen Speicher"

Erforderlicher Speicher: Minimaler Speicher, der zum Ausführen von Sortieren und Hash-Join erforderlich ist. Es wird als erforderlich bezeichnet, da eine Abfrage ohne diesen verfügbaren Speicher nicht gestartet werden würde. SQL Server verwendet diesen Speicher, um interne Datenstrukturen für Sortier- und Hash-Joins zu erstellen.

Zumindest wird die Abfrage ausgeführt, aber zur Laufzeit wird das Zwischenergebnis höchstwahrscheinlich an Tempdb übertragen, wodurch sie langsam wird. Ich empfehle dringend, dass Sie " Understanding Query Memory Grant" lesen


Ich verstehe das, aber der Teil, der mich ein bisschen verblüfft, ist, was passiert, wenn Sie Daten zusammenfügen und filtern und diese Ergebnisse die Größe des Caches überschreiten. Die Daten müssten kompiliert werden, um den Rückgabesatz zu erstellen, aber der Rückgabesatz ist größer als die Größe des Caches. Durchläuft der interne Speicher noch Seiten, bis das Endergebnis angezeigt wird? Mein Gedanke wäre, dass es die Ergebnisse in Tempdb schreiben würde, da es den Cache überschreitet und dann von der Festplatte liest, aber nicht weiß, ob das der Fall ist
Dustin

2
@Dustin Meine Antwort bearbeitet, bitte überprüfen
Shanky
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.