Arbeitstabellen sind materialisierte temporäre Ergebnismengen, die während der Ausführung einer Abfrage erstellt werden. Arbeitstabellen werden verwendet, wenn SQL Anywhere feststellt, dass die Kosten hierfür geringer sind als für alternative Strategien. Im Allgemeinen dauert es bei Verwendung einer Arbeitstabelle länger, bis die ersten Zeilen abgerufen werden, jedoch können die Kosten für das Abrufen sämtlicher Zeilen in einigen Fällen deutlich niedriger sein. Aufgrund dieser Differenz wählt SQL Anywhere basierend auf der Einstellung "optimization_goal" verschiedene Strategien. Der Standardwert ist Erste Zeile (first-row). Wenn "erste Zeile" eingestellt ist, versucht SQL Anywhere, Arbeitstabellen zu vermeiden. Wenn "alle Zeilen" eingestellt ist, verwendet SQL Anywhere Arbeitstabellen, wenn diese die Gesamtausführungskosten für eine Abfrage verringern.
Weitere Informationen über die Einstellung "optimization_goal" finden Sie unter optimization_goal-Option [Datenbank].
Arbeitstabellen werden in den folgenden Fällen verwendet:
Wenn die Abfrage eine ORDERBY-, GROUPBY- oder DISTINCT-Klausel enthält und SQL Anywhere keinen Index zum Sortieren der Zeilen verwendet. Wenn ein geeigneter Index vorhanden ist und die Einstellung "optimization_goal" auf "erste Zeile" gesetzt ist, vermeidet SQL Anywhere die Verwendung einer Arbeitstabelle. Wenn "optimization_goal" jedoch auf "alle Zeilen" gesetzt wird, kann es kostenträchtiger sein, alle Zeilen einer Abfrage mit einem Index abzurufen, als eine Arbeitstabelle aufzubauen und die Zeilen zu sortieren. SQL Anywhere wählt die kostengünstigere Strategie, wenn das Ziel der Optimierung auf "alle Zeilen" gesetzt ist. Bei GROUP BY und DISTINCT verwenden zwar die Hash-basierten Algorithmen Arbeitstabellen, sie sind jedoch im Allgemeinen effizienter, wenn alle Zeilen einer Abfrage abgerufen werden.
Wenn ein Hash Join-Algorithmus gewählt wurde. In diesem Fall werden Arbeitstabellen zum Speichern der Zwischenergebnisse verwendet (wenn die Eingabe nicht in den Speicher passt), und die Ergebnisse des Joins werden ebenfalls in einer Arbeitstabelle gespeichert.
Wenn ein Cursor mit empfindlichen Werten geöffnet wird. In diesem Fall wird eine Arbeitstabelle erstellt, welche die Zeilenidentifizierer und Primärschlüssel der Basistabellen enthält. Diese Arbeitstabelle wird gefüllt, wenn Zeilen von der Abfrage in Vorwärtsrichtung abgerufen werden. Wenn Sie jedoch die letzte Zeile aus dem Cursor abrufen, wird die gesamte Tabelle gefüllt.
Wenn ein Cursor mit unempfindlicher Semantik geöffnet wird. In diesem Fall wird eine Arbeitstabelle mit den Ergebnissen der Abfrage gefüllt, wenn die Abfrage geöffnet wird.
Wenn ein mehrzeiliges UPDATE durchgeführt wird und die aktualisierte Spalte in der WHERE-Klausel der Aktualisierung oder in einem Index verwendet wird, der für die Aktualisierung nötig ist.
Wenn ein mehrzeiliges UPDATE oder DELETE eine Unterabfrage in der WHERE-Klausel hat, welche die zu ändernde Tabelle referenziert.
Wenn ein INSERT von einer SELECT-Anweisung durchgeführt wird und die SELECT-Anweisung die INSERT-Tabelle referenziert.
Wenn ein mehrzeiliges INSERT, UPDATE oder DELETE durchgeführt wird und für die Tabelle ein entsprechender Trigger definiert ist, der während des Vorgangs ausgelöst werden kann.
In diesen Fällen werden die von dem Vorgang betroffenen Datensätze in die Arbeitstabelle eingetragen. Unter bestimmten Umständen, wie z.B. bei Keyset-gesteuerten Cursor, wird ein temporärer Index für die Arbeitstabelle aufgebaut. Das Extrahieren der erforderlichen Datensätze in eine Arbeitstabelle kann recht lange dauern, bevor die Abfrageergebnisse erscheinen. Mithilfe von Indizes, die zum Sortieren verwendet werden können (wie oben im ersten Fall), werden die ersten Zeilen schneller abgerufen. Es kann jedoch sein, dass die Zeit, die insgesamt zum Abrufen aller Zeilen erforderlich ist, kürzer ist, wenn Arbeitstabellen verwendet werden, da diese Abfragealgorithmen ermöglichen, die auf der Hash- und Merge-Sort-Methode basieren. Diese Algorithmen verwenden sequenzielle I/O-Vorgänge, die schneller sind als wahlfreie I/O-Vorgänge, die mit einem Index Scan verwendet werden.
Der Optimierer analysiert jede Abfrage, um festzustellen, ob eine Arbeitstabelle die beste Performance liefert. Für derartige Optimierungen sind keinerlei Eingriffe durch den Benutzer erforderlich.
Die oben genannten Fälle von INSERT, UPDATE und DELETE stellen gewöhnlich kein Performance-Problem dar, da es sich dabei um einmalige Vorgänge handelt. Wenn jedoch Probleme auftreten, können Sie den Befehl umformulieren, um den Konflikt sowie den Aufbau von Arbeitstabellen zu vermeiden. Das ist nicht immer möglich.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |