Wenn SQL Anywhere eine Unterabfrage verarbeitet, stellt er das Ergebnis in den Cache. Diese Zwischenspeicherung erfolgt pro Anforderung, wobei die im Cache abgelegten Ergebnisse nie von gleichzeitigen Anforderungen bzw. Verbindungen gemeinsam benutzt werden. Wenn SQL Anywhere die Unterabfrage für dieselbe Menge von Korrelationswerten neu auflösen muss, kann das Ergebnis einfach aus dem Cache abgerufen werden. Auf diese Art vermeidet SQL Anywhere viele Wiederholungen und überflüssige Berechnungen. Wenn die Anforderung abgeschlossen ist (der Cursor der Abfrage ist geschlossen), gibt SQL Anywhere die im Cache abgelegten Werte frei.
Während die Verarbeitung einer Abfrage fortgesetzt wird, überwacht SQL Anywhere die Häufigkeit, mit der Unterabfragenwerte im Cache wieder verwendet werden. Wenn sich die Werte der korrelierenden Variablen selten wiederholen, muss SQL Anywhere die meisten Werte nur einmal berechnen. In diesem Fall erkennt SQL Anywhere, dass es effizienter ist, wenige mehrfach vorhandene Werte erneut zu berechnen, als zahlreiche Einträge in den Cache zu legen, die nur einmal vorkommen. Daher legt der Datenbankserver die Unterabfrage für den Rest der Anweisung nicht mehr im Cachespeicher ab und fährt fort, die Unterabfrage für jede einzelne Zeile im äußeren Abfrageblock neu aufzulösen.
SQL Anywhere verwendet auch keinen Cache, wenn die Größe der abhängigen Spalte mehr als 255 Byte beträgt. In diesen Fällen ist es möglicherweise sinnvoll, Ihre Abfrage umzuschreiben oder eine weitere Spalte Ihrer Tabelle hinzuzufügen, um solche Vorgänge effizienter zu machen.
Einige integrierte und benutzerdefinierte Funktionen werden auf dieselbe Art und Weise im Cache abgelegt wie die Ergebnisse von Unterabfragen. Das kann zu einer beachtlichen Verbesserung für kostenträchtige Funktionen führen, die während der Abfrageverarbeitung mit denselben Parametern aufgerufen werden. Jedoch kann dies auch bedeuten, dass eine Funktion seltener aufgerufen wird, als anderenfalls zu erwarten wäre.
Damit eine Funktion im Cache abgelegt werden kann, muss sie zwei Bedingungen erfüllen:
Sie muss jederzeit dasselbe Ergebnis für eine gegebene Menge von Parametern liefern.
Sie darf keine Auswirkungen auf die zugrunde liegenden Daten haben.
Funktionen, die diese Bedingungen erfüllen, werden als deterministische oder idempotente Funktionen bezeichnet. SQL Anywhere behandelt alle benutzerdefinierten Funktionen als deterministisch (außer sie werden zur Erstellungszeit ausdrücklich als NOT DETERMINISTIC deklariert). Das heißt, der Datenbankserver nimmt an, dass zwei aufeinander folgende Aufrufe derselben Funktion mit denselben Parametern das gleiche Ergebnis zurückgeben und keine unerwünschten Nebeneffekte auf die Semantik der Abfrage haben.
Mit wenigen Ausnahmen werden integrierte Funktionen als deterministisch behandelt. Die Funktionen RAND, NEW_ID und GET_IDENTITY werden als nicht deterministisch behandelt und ihre Ergebnisse werden nicht in den Cache aufgenommen.
Weitere Hinweise zu benutzerdefinierten Funktionen finden Sie unter CREATE FUNCTION-Anweisung (Webdienste).
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 |