Interner Arbeitsspeicher

13

In meinen Büchern über SQL Server 2008 Internals und Troubleshooting (von der örtlichen Bibliothek in Illinois ausgeliehen) von Christian Bolton, Brent Ozar usw. versuche ich, Verständnis und Bestätigung für SQL Server zu erlangen kann mein Verständnis bestätigen oder korrigieren.

Für jede Abfrage oder Operation, die eine Speicherzuweisung für Abfragen erfordert, wird Arbeitsspeicher benötigt. Bei allgemeinen Abfragen unter Verwendung von Sortieren, Hash-Match-Join, Parallelität (nicht sicher), Masseneinfügung (nicht sicher), Index-Neuaufbau usw. wird der Arbeitsspeicher für Abfragen benötigt.

Der Arbeitsspeicher ist Teil des SQL Server-Pufferpools (er wird als Teil des Pufferpools zugewiesen) und der maximale Arbeitsspeicher beträgt 75% des dem Pufferpool zugewiesenen Speichers. Standardmäßig kann eine einzelne Abfrage nicht mehr als 25% des Arbeitsspeichers abrufen (in SQL 2008 / SQL 2012 - standardmäßig von der Standard-Arbeitsauslastungsgruppe des Resource Governors gesteuert).

Ich suche eine Bestätigung meines Verständnisses

1) In Anbetracht des Systems mit 48 GB RAM und maximalem Serverspeicher, der auf 40 GB konfiguriert ist, bedeutet dies, dass der maximale Arbeitsspeicher auf 30 GB begrenzt ist und eine einzelne Abfrage nicht mehr als 10 GB Arbeitsspeicher (Abfragespeicher) abrufen kann. Wenn Sie also eine schlechte Abfrage haben, die mit einer Milliarde Zeilen arbeitet, die einen massiven Hash-Join ausführen, und mehr als 10 GB Speicher (Arbeitsspeicher) benötigen, ist es dann sogar wichtig, diese Speicherzuweisungswarteschlange zu durchlaufen oder sofort auf die Festplatte zu verschütten?

2) Wenn einer Abfrage, die eine umfangreiche Sortieroperation ausführt, ein Arbeitsspeicher von 5 MB zugewiesen wurde, und wenn der Abfrageoptimierer während der Abfrageausführung der Abfrage feststellt, dass diese Abfrage aufgrund fehlerhafter Statistiken oder fehlender Indizes tatsächlich 30 MB Arbeitsspeicher benötigt wird sofort zu tempdb verschütten. Selbst wenn das System während der Ausführung über ausreichend Arbeitsspeicher verfügt, muss die Abfrage den zugewiesenen Arbeitsspeicher während der Ausführung überschreiten und auf die Festplatte übertragen werden. Stimmt mein Verständnis?

SQL-Lerner
quelle

Antworten:

13

Würde es Ihnen sogar etwas ausmachen, diese Speicherzuweisungswarteschlange zu durchlaufen oder sofort auf die Festplatte zu gelangen?

So funktioniert das nicht. Sobald ein Plan ausgewählt wurde, für den eine Speicherzuweisung erforderlich ist, muss die Abfrage die Zuweisung erhalten, damit sie die Warteschlange durchläuft. Etwaiges Verschütten erfolgt viel später im Ausführungszyklus. Eine Abfrage kann nicht entscheiden, ob stattdessen die Gewährung und das Verschütten ausgeführt werden soll. Es muss die Bewilligung erhalten und, falls nicht, die Ausführung beginnen. Wenn sich herausstellt, dass der Zuschuss nicht ausreicht (aufgrund einer schlechten Schätzung oder aufgrund der Erlangung eines viel geringeren Zuschusses als beantragt), wird die Abfrage zum Verschütten gezwungen.

Wenn das Abfrageoptimierungsprogramm dies aufgrund von schlechten Statistiken oder fehlenden Indizes erkennt

Genau genommen ist nicht der Optimierer, sondern die Abfrageausführung. Das Abfrageoptimierungsprogramm hat nur ein Mitspracherecht bei der Entscheidung über den Plan. Sobald der Plan ausgewählt und ausgeführt wurde, ist das Optimierungsprogramm nicht mehr im Bild. Auch 'fehlende Indizes' spielen hier keine Rolle. Ein fehlender Index kann einen fehlerhaften Plan erzwingen, aber nicht beeinflussen, wie dieser "fehlerhafte" Plan ausgeführt wird, da dieser Plan unter Berücksichtigung der tatsächlich vorhandenen Indizes erstellt wurde, sodass er genau weiß, was er kann und was nicht. Verschüttungen treten fast immer aufgrund falscher Schätzungen auf, d.h. schlechte Statistiken oder Algorithmen zur Schätzung der schlechten Kardinalität im Optimierer und in der Ausführung (es wird sehr komplex, wenn Sie sich mit den Details befassen, also höre ich hier auf).

Selbst wenn das System während der Ausführung über ausreichend Arbeitsspeicher verfügt, muss die Abfrage den zugewiesenen Arbeitsspeicher während der Ausführung überschreiten und auf die Festplatte übertragen werden

Leider ja. Das Optimierungsprogramm sollte jedoch einen Plan erstellen, der den verfügbaren Arbeitsspeicher nutzt.

Ich empfehle das Lesen Verständnis SQL Server Speichergewährungs ist die beste Informationen von einem zum Thema breiten Rand.

Remus Rusanu
quelle
4
Remus Rusanu (MSFT) Ich habe während der Websuche auch in Ihrem Blog-Post nachgesehen, der sich auf Operatoren bezieht, die eine Speichergewährung für Abfragen benötigen. Vielen Dank, dass Sie ein wahres Juwel sind, das dieses Forum unterstützt.
SQL Learner
Remus, diese PASS-Gipfelsitzung von Adam Machanic ist sehr gründlich und klärt alle Fragen im Zusammenhang mit dem Arbeitsspeicher.
SQL Learner