Oracle Database · · 3 Min.

Oracle PL/SQL PRAGMA UDF: Funktionen in SQL beschleunigen

Wenn SQL eine PL/SQL-Funktion für viele Zeilen aufruft, kann PRAGMA UDF die Ausführung effizienter machen – vorausgesetzt, Messungen bestätigen den Effekt.

Eine fachliche Berechnung lässt sich oft gut als PL/SQL-Funktion kapseln und anschließend in einer Abfrage verwenden. Wird die Funktion jedoch für sehr viele Zeilen aufgerufen, kann der Wechsel zwischen SQL- und PL/SQL-Ausführung zusätzlichen Aufwand verursachen. Oracle bietet dafür PRAGMA UDF: Die Deklaration teilt dem Compiler mit, dass eine Funktion überwiegend aus SQL verwendet wird. Das kann ihre Performance verbessern, garantiert aber keinen Gewinn.

Pragma an der Funktion deklarieren

Das Pragma steht im Deklarationsteil der Funktion, zwischen IS und BEGIN:

CREATE OR REPLACE FUNCTION calculate_bonus (
  p_salary     IN NUMBER,
  p_percentage IN NUMBER
) RETURN NUMBER IS
  PRAGMA UDF;
BEGIN
  RETURN ROUND(p_salary * p_percentage / 100, 2);
END calculate_bonus;
/

Die Funktion kann dann wie gewohnt in einer SQL-Abfrage aufgerufen werden:

SELECT employee_id,
       calculate_bonus(salary, 7.5) AS bonus
FROM   employees
WHERE  department_id = :department_id;

Das Pragma ändert nicht die fachliche Logik der Funktion. Es ersetzt auch keine bessere Lösung in reinem SQL: Lässt sich eine Berechnung als SQL-Ausdruck formulieren, sollte zuerst geprüft werden, ob dadurch der Funktionsaufruf pro Zeile ganz entfällt.

Den Effekt sauber messen

Testen Sie mit repräsentativer Datenmenge, denselben Bind-Werten und vergleichbarer Systemlast. Vergleichen Sie Laufzeit und Ressourcenverbrauch vor und nach der Änderung; ein einzelner Lauf unter wechselnder Last ist kein belastbarer Beleg. Besonders sinnvoll ist der Test, wenn die Funktion tatsächlich oft aus SQL aufgerufen wird. Bei wenigen Aufrufen oder sehr einfacher Logik kann der Unterschied unbedeutend sein.

Prüfen Sie außerdem, ob die Funktion unnötige Arbeit pro Zeile verrichtet, etwa wiederholte SQL-Abfragen oder aufwendige Umwandlungen. PRAGMA UDF reduziert nicht die Anzahl dieser Aufrufe und macht aus zeilenweiser Verarbeitung keine mengenbasierte Verarbeitung. Wo möglich, sind ein SQL-Ausdruck, ein Join oder eine aggregierte Abfrage oft der größere Hebel.

Nicht mit DETERMINISTIC verwechseln

PRAGMA UDF ist keine Zusicherung, dass gleiche Eingaben immer gleiche Ergebnisse liefern, und es aktiviert keinen Ergebniscache. Das ist etwas anderes als DETERMINISTIC. Markieren Sie eine Funktion nur dann als deterministisch, wenn das fachlich wirklich stimmt – also ihr Ergebnis nicht von Uhrzeit, Session-Kontext, veränderlichen Tabellen oder anderem externen Zustand abhängt.

Fazit

PRAGMA UDF ist eine kleine, gezielte Optimierung für PL/SQL-Funktionen, die überwiegend aus SQL aufgerufen werden. Setzen Sie es dort ein, wo Messungen den Aufwand zeigen, und prüfen Sie zuerst, ob die Funktion durch eine mengenorientierte SQL-Lösung ersetzt werden kann.

Weiterführend: Oracle-Dokumentation zu PRAGMA UDF und zu PL/SQL-Funktionen, die aus SQL aufgerufen werden.