Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Unkorrelierte Funktionsaufrufe

Funktionsaufrufe einer UDF mit konstanten Eingabewerten werden als unkorrelierte Funktionsaufrufe bezeichnet. Konstante Eingabewerte beziehen sich nicht auf die SQL-Anweisung, die den Funktionsaufruf enthält,

Unkorrelierte Funktionsaufrufe werden bei der Ausführung der Anweisung von SESAM/SQL so behandelt:

  • Für die Auswertung von Bedingungen werden Funktionswerte von unkorrelierten Funktionsaufrufen nur einmal berechnet.

  • Für folgende Ausgabewerte dagegen werden Sie jedesmal neu berechnet:

    • in SELECT-Listen

    • für ORDER BY-Werte

    • für Werte in INSERT-Zeilen

    • für UPDATE... SET ...-Werte

    • für die INSERT- / UPDATE-Werte innerhalb einer MERGE-Anweisung


Beispiel

SELECT f(1,2) FROM t WHERE col < g(5+4,8,9)

Die Funktionsaufrufe f(1,2) und g(5+4,8,9) dieser SQL-Anweisung sind unkorreliert.

Es wird, um die Bedingung für die Sätze von t auszuwerten, die Funktion g nur einmal berechnet. Mit diesem konstanten Ergebnis wird dann die Treffermenge der Abfrage bestimmt. So können in der Bedingungsauswertung auch Indizes genutzt werden.

In der SELECT-Liste dagegen wird fuer jeden Treffersatz der Funktionswert der Funktionn f neu berechnet.

Annotationen VOLATILE / IMMUTABLE

Die Annotationen /*% VOLATILE %*/ und /*% IMMUTABLE %*/ steuern die Ausführung von unkorrelierten Funktionsaufrufen. Sie werden nur in einem Funktionsaufruf zwischen dem Namen der Funktion und der öffnenden Klammer für die Funktionsparameter akzeptiert. An anderen Stellen führen diese Annotationen zu einem Syntaxfehler für die Anweisung..

Bei Angabe von /*% VOLATILE %*/ wird der Funktionswert stets neu berechnet.

Bei Angabe von /*% IMMUTABLE %*/ in einem unkorrelierten Funktionsaufruf wird der Funktionswert nicht nochmals neu berechnet. Es wird der zuvor berechnete Funktionswert verwendet. Beim ersten Funktionsaufruf wird der Funktionswert neu berechnet.

Ohne Angabe einer dieser Annotationen wird die bisherige, zuvor beschriebene Vorgehensweise von SESAM/SQL angewendet.


Beispiel

SELECT f /*% VOLATILE %*/ (1,2)

FROM t WHERE col < g /*% IMMUTABLE %*/ (5+4,8,9)

Diese Funktionsaufrufe bilden die bisherige Vorgehensweise von SESAM/SQL mit Annotationen nach.


SELECT f /*% IMMUTABLE %*/ (1,2)

FROM t WHERE col < g /*% VOLATILE %*/ (5+4,8,9)

Durch die Angabe der Annotationen wird die Funktion g stets neu berechnet. Die Funktion f wird nur einmal berechnet.