Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Abfragen optimieren und ausführen » So funktioniert der Optimierer » Grundlegende Annahmen des Optimierers

 

Der Speichernutzungswächter

Der SQL Anywhere-Datenbankserver nutzt den Cache, auch Pufferpool genannt, um Abbilder von Datenbankseiten temporär zu speichern (zu puffern). Diese Seiten sind üblicherweise Tabellen- und Indexseiten, auch wenn verschiedene andere Arten von physischen Seiten in einer SQL Anywhere-Datenbank gespeichert werden können. Zusätzlich zu diesen Seiten nutzt der Datenbankserver den Cache für zwei weitere Speicherpools. Einer dieser Pools ist der virtuelle Speicher, der von Datenbankservern für Datenstrukturen verwendet wird, die Verbindungen, Anweisungen und Cursor darstellen. Der zweite Pool besteht aus Cache-Seiten, die als virtueller Speicher für den Abfragespeicher verwendet werden.

Algorithmen zur Abfrageausführung, wie Hash-Joins und Sortierung, benötigen Speicher für einen effizienten Betrieb. SQL Anywhere verwendet einen Speichernutzungswächter, um festzulegen, wie viel Abfragespeicher jede Anweisung für die Abfrageausführung verwenden darf. Der Speichernutzungswächter ist dafür verantwortlich, dem Pool des Abfragespeichers Anweisungen zuzuweisen, um eine effiziente Ausführung der Systemlast zu gewährleisten. Die Datenbankserver-Eigenschaft QueryMemPages zeigt die Anzahl der Seiten im Abfragespeicher-Pool an, die für eine Verteilung zur Verfügung stehen. Die Poolgröße wird als ein Prozentsatz der maximalen Cachegröße für den Datenbankserver, d.h. der Cache-Obergrenze, festgelegt, die mittels der Serveroption -ch gesteuert werden kann. Die Datenbankserver-Eigenschaft QueryMemPercentOfCache gibt den Prozentsatz der maximalen Cachegröße an, der als Abfragespeicher verwendet werden kann. Er beträgt 50%.

Der Speichernutzungswächter teilt einzelnen Anweisungen eine ausgewählte Anzahl von Seiten zu, die die Anweisung dann für speicherintensive Abfrageverarbeitungs-Algorithmen verwenden kann. Der Speicher im Abfragespeicher-Pool steht weiterhin für andere Zwecke (wie Puffern von Tabellen- oder Indexseiten) zur Verfügung, bis der Abfrageverarbeitungs-Algorithmus die Seiten verwendet. Speicherintensive Abfrageverarbeitungs-Algorithmen, die den Abfragespeicher verwenden, sind alle Hash-basierten Operatoren, wie Hash-Distinct, Hash-Group-By und Hash-Join, sowie Sortierungs- und Fenster-Operatoren.

Wenn eine Anweisung ausgeführt wird, verwendet der Speichernutzungswächter die Schätzungen des Optimierers, um zu bestimmen, wie viel Speicher für die Anweisung sinnvoll (useful) wäre. Diese Schätzung wird im grafischen Plan als QueryMemMaxUseful dargestellt. Der Abfragespeicher für die Anweisung wird den einzelnen speicherintensiven Operatoren zugewiesen, die im Zugriffsplan für diese Anforderung verwendet werden. Parallele speicherintensive Operatoren unterhalb eines Exchange-Operators erhalten jeweils ihre eigene Zuweisung von Abfragespeicherplatz. Bei einfachen Anforderungen bringen große Speichermengen keinen zusätzlichen Nutzen, aber Anforderungen, die Hash-basierte Operatoren oder Sortierung verwenden, arbeiten effizienter, wenn Speicher vorhanden ist, um alle benötigten Zeilen im Speicher zu halten.

Eine Erhöhung der Datenbankserver-Multiprogramming-Stufe erfordert, dass der Datenbankserver einen bestimmten Anteil des Abfragespeichers für jeden zusätzlichen, gleichzeitig laufenden Task bzw. für jede zusätzliche, gleichzeitig laufende Anforderung reserviert, wodurch der Anteil verringert wird, der einer bestimmten Anforderung zur Verfügung steht. Zudem beschränkt der Speichernutzungswächter die Anzahl der speicherintensiven Anforderungen, die gleichzeitig ausgeführt werden können. Dieser Höchstwert wird basierend auf den Performance-Merkmalen des Computers ermittelt, auf dem der Datenbankserver läuft, und dieses Limit wird mit der Servereigenschaft QueryMemActiveMax angezeigt. Der Speichernutzungswächter führt auch eine laufende Schätzung der Anzahl der gleichzeitigen, speicherintensiven Anforderungen durch. Diese Schätzung wird als die Datenbankserver-Eigenschaft bzw. als die Systemmonitor-Statistik QueryMemActiveEst verfügbar gemacht. Der Speichernutzungswächter verwendet diesen laufenden Mittelwert, um zu ermitteln, wie Speicher aus dem Abfragespeicher-Pool zugeordnet werden soll. Wenn nur wenige speicherintensive Anforderungen ausgeführt werden, wird ihnen jeweils mehr Speicher zugeordnet. Wenn viele ausgeführt werden, erhalten sie jeweils weniger Speicher, um den zur Verfügung stehenden Abfragespeicher gleichmäßig aufzuteilen. Dabei wird die geschätzte Anzahl der Abfragespeicher-Seiten berücksichtigt, die die einzelnen Anforderungen benötigen.

Wenn eine speicherintensive Anweisung mit der Ausführung beginnt und bereits die maximale Anzahl von gleichzeitigen speicherintensiven Anforderungen ausgeführt wird, dann warten die eingehenden Anweisungen darauf, dass eine der bestehenden Anforderungen ihren zugewiesenen Speicher freigibt. Die Datenbankoption query_mem_timeout steuert, wie lange die eingehende Anforderung auf eine Speicherzuweisung wartet. Bei der Standardeinstellung -1 wartet die Anforderung für eine im Datenbankserver definierte Zeitspanne. Wenn nach der Wartezeit keine Speicherzuweisung verfügbar ist, wird der Zugriffsplan der Anweisung mit einer kleinen Speichermenge ausgeführt, was zu einer langsameren Ausführung führen kann, möglicherweise unter Verwendung einer Niedrig-Speicher-Ausführungsstrategie, falls es im Plan eine solche für speicherintensive physische Operatoren gibt. Die Datenbankserver-Eigenschaft bzw. die Systemmonitor-Statistik QueryMemGrantWaiting zeigt die aktuelle Anzahl der Anforderungen an, die auf eine Speicherzuweisung warten; QueryMemGrantWaited zeigt an, wie viele Male eine Anforderung insgesamt warten musste, bevor eine Speicherzuweisung erteilt wurde.

Im grafischen Plan zeigt der Wert QueryMemNeedsGrant an, ob der Speichernutzungswächter die Anforderung für eine einfache Anforderung (keine Speicherzuweisung erforderlich) oder für eine speicherintensive Anforderung (Speicherzuweisung erforderlich) hält. Wenn der Speichernutzungswächter eine Anforderung als einfach klassifiziert, d.h. dass keine Speicherzuweisung erforderlich ist, beginnt die Anforderung umgehend mit der Ausführung. Ansonsten fordert die Anforderung einen Prozentsatz des Abfragespeicher-Pools an. Der Wert QueryMemLikelyGrant im grafischen Plan zeigt in einer Schätzung an, wie viele Seiten der Anforderung wahrscheinlich für die Ausführung zugewiesen werden.

 Siehe auch