Wenn kein physischer Speicher mehr für Daten vorhanden ist, verschiebt SQL Server die bereits vorhandenen Daten in TEMPDB
Der Artikel, mit dem Sie verlinkt haben, ist bestenfalls irreführend und an einigen Stellen falsch. Ich denke, der Autor hat versucht, einige komplizierte Dinge zu stark zu vereinfachen, und ist dabei ein wenig zu weit gegangen.
SQL Server verschiebt auf diese Weise keine Daten aus dem Speicher (dem Pufferpool) in tempdb. Es wird (im Allgemeinen) eine "zuletzt verwendete" Cachestrategie verwendet. Wenn also Speicherdruck besteht und neue Daten in den Speicher gezogen werden müssen, werden die LRU-Daten von SQL Server aus dem Pufferpool entfernt, um die neuen Daten aufzunehmen. Dieses Verhalten wird häufig von einem Leistungsindikator namens "Page Life Expectancy" (PLE) überwacht :
Die Definition von PLE ist die erwartete Zeit in Sekunden, die eine Datendateiseite, die in den Pufferpool (den speicherinternen Cache von Datendateiseiten) eingelesen wird, im Speicher verbleibt, bevor sie aus dem Speicher verschoben wird, um Platz für andere Daten zu schaffen Dateiseite. Eine andere Möglichkeit, sich PLE vorzustellen, ist eine augenblickliche Messung des Drucks auf den Pufferpool, um Speicherplatz für Seiten freizugeben, die von der Festplatte gelesen werden. Für beide Definitionen ist eine höhere Zahl besser.
Während der Ausführung der Abfrage, SQL Server kann tempdb für bestimmte Operationen verwenden. Dies geschieht normalerweise, wenn die Schätzungen schlecht sind, aber wenn nur wenig Speicher verfügbar ist, kann dies das Verhalten beeinflussen.
Einige der Vorgänge, die auf diese Weise auf Tempdb "übergreifen" können, sind das Hashing von Zeilen (für Joins oder Aggregate usw.), das Sortieren von Zeilen im Speicher und das Puffern von Zeilen während der parallelen Abfrageausführung.
Benutzerabfragen können auch explizit Tempdb (mit globalen oder lokalen temporären Tabellen) und implizit Tempdb (mit Snapshot- oder Read-Committed-Snapshot-Isolationsstufen) verwenden.
Keine dieser Situationen scheint wirklich zu der Aussage zu passen, die Sie zitiert haben.
Wenn nicht mehr genügend physischer Speicher verfügbar ist, kann das Betriebssystem die SEITENDATEI verwenden und Daten aus dem physischen Speicher dorthin verschieben
Dies kann definitiv passieren und liegt größtenteils außerhalb der Kontrolle von SQL Server. Es gibt einen Knopf, mit dem Sie versuchen können, bestimmte Arten von Paging auf Betriebssystemebene zu verhindern, nämlich das Aktivieren von "Lock Pages in Memory" (LPIM) :
Diese Windows-Richtlinie bestimmt, welche Konten einen Prozess verwenden können, um Daten im physischen Speicher zu speichern, und verhindert, dass das System die Daten in den virtuellen Speicher auf der Festplatte paginiert.
Also, was können wir verhindern, dass auf die Festplatte ausgelagert wird?
Vor SQL Server 2012 wurden Seiten, die über eine Komponente namens "Single Page Allocator" zugewiesen wurden, im Speicher gesperrt (konnte nicht ausgelagert werden). Dies umfasste den Pufferpool (Datenbankseiten), den Prozedurcache und einige andere Speicherbereiche.
Weitere Informationen finden Sie unter Spaß mit gesperrten Seiten, AWE, Task-Manager und dem Arbeitssatz ... , insbesondere im Abschnitt "4. Jetzt weiß ich, dass SQL Server unter x64" Gesperrte Seiten "verwenden kann. Was genau ist gesperrt?" Weitere verwandte Literatur finden Sie hier: Große SQL Server-Debatten: Seiten im Speicher sperren
In SQL Server 2012 und höher gibt es keinen "Einzelseitenzuweiser" (die Einzel- und Mehrseitenzuweisungen wurden gemäß einem ausführlichen Blick auf den Arbeitsspeicher (SQL Server 2012/2014 ) zusammengeführt). Die Details dessen, was genau ausgelagert werden kann und was nicht, sind nirgendwo detailliert dokumentiert, wo ich sie gesehen habe. Sie können eine Abfrage verwenden , wie dies zu sehen , was ist gesperrt:
select osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn
inner join sys.dm_os_nodes osn on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'
In demselben MS Support-Artikel können Sie auch nachlesen DBCC MEMORYSTATUS
, wie viel Speicher "gesperrt" ist.
Als Randnotiz können Sie im Fehlerprotokoll Hinweise darauf finden, dass der Arbeitssatz von SQL Server vom Betriebssystem ausgelagert wird. Es wird Nachrichten geben, die so aussehen:
2019-09-02 10: 19: 27.29 spid11s Ein erheblicher Teil des SQL Server-Prozessspeichers wurde ausgelagert. Dies kann zu Leistungseinbußen führen. Dauer: 329 Sekunden Arbeitssatz (KB): 68780, Festgeschrieben (KB): 244052, Speichernutzung: 28%.