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?
quelle