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.