Kann jemand bitte die Unterschiede zusammenfassen zwischen:
http://www.postgresql.org/docs/9.1/static/xfunc-sql.html
und
http://www.postgresql.org/docs/9.1/static/plpgsql.html
?
Hauptpunkte:
- konzeptionelle Unterschiede
- gegeben eine Problemfamilie, Bequemlichkeit der Verwendung
- politische Probleme
postgresql
stored-procedures
plpgsql
Gismo Ranas
quelle
quelle
Antworten:
PL / PgSQL- und einfache SQL-Funktionen sind beide Teil eines größeren Werkzeugsatzes und sollten in diesem Zusammenhang betrachtet werden. Ich neige dazu, es in einem aufsteigenden Leistungsmaßstab zu sehen, der mit steigender Komplexität und steigenden Kosten einhergeht, wobei Sie das einfachste Werkzeug verwenden sollten, das die Aufgabe gut erledigt:
LISTEN
undNOTIFY
um mit ihm zu reden.Sehr häufig ist eine Ansicht ausreichend, wenn Sie denken, dass eine Funktion benötigt wird. Auch wenn dies für
SELECT
die gesamte Ansicht extrem teuer ist , werdenWHERE
Klauseln in der Abfrage, die auf die Ansicht verweisen, normalerweise in die Ansicht verschoben und können zu sehr unterschiedlichen Abfrageplänen führen. Ich habe oft große Leistungsverbesserungen durch das Konvertieren von SQL-Funktionen in Ansichten erhalten.Wenn Sie feststellen, dass Sie eine Ansicht nicht verwenden können und eine SQL-Funktion in Betracht ziehen sollten, gilt Folgendes:
WHERE
Klauseln ausgedrückt werden können, werden wie ein Parameter in einemWITH
Ausdruck benötigtSECURITY DEFINER
Funktion, und diesecurity_barrier
Ansichten in PostgreSQL 9.2 und höher sind für Ihre Anforderungen nicht ausreichend.Bei den meisten dieser Aufgaben funktioniert eine einfache SQL-Funktion einwandfrei und ist oft einfacher zu lesen als PL / PgSQL. Deklarierte
STABLE
oderIMMUTABLE
(und nicht deklarierteSTRICT
oderSECURITY DEFINER
) SQL-Funktionen können auch in die aufrufende Anweisung eingefügt werden. Dies beseitigt den Funktionsaufruf-Overhead und kann manchmal auch zu enormen Leistungsvorteilen führen, wenn eine WHERE-Bedingung in der aufrufenden Funktion vom Optimierer in die SQL-Funktion gedrückt wird. Verwenden Sie SQL-Funktionen, wenn sie für die Aufgabe ausreichen.Die Hauptzeit, in der SQL-Funktionen den Job nicht ausführen, ist, wenn Sie viel Logik benötigen. Wenn / then / else-Operationen, die Sie nicht als
CASE
Anweisungen ausdrücken können , vielfache Wiederverwendung von berechneten Ergebnissen, Aufbauen von Werten aus Chunks, Fehlerbehandlung usw., ist PL / PgSQL dann nützlich. Wählen Sie PL / PgSQL, wenn Sie SQL-Funktionen nicht verwenden können oder wenn diese nicht gut passen, wie zum Beispiel für:EXECUTE
AnweisungRAISE
Fehler / Warnungen für die Protokolle oder Client möchtenEXCEPTION
Blöcken abfangen und behandeln, anstatt die gesamte Transaktion bei einem Fehler zu beendenCASE ... WHEN
sehr gut passtWITH
und CTEsBei allgemeinen Tabellenausdrücken (CTEs), insbesondere bei beschreibbaren CTEs
WITH RECURSIVE
, verwende ich PL / PgSQL viel seltener als früher, da SQL so viel aussagekräftiger und leistungsfähiger ist. Ich benutze jetzt viel mehr Views und einfache SQL-Funktionen. Denken Sie daran, dass einfache SQL-Funktionen mehrere Anweisungen enthalten können. Die letzte Anweisung ist das Ergebnis der Funktion.quelle
plpgsql
ist eine vollständige prozedurale Sprache mit Variablen, Schleifenkonstrukten usw. EineSQL
Funktion ist einfach eine Unterabfrage. Eine SQL-Funktion kann, wenn sie deklariertSTABLE
oderIMMUTABLE
nicht deklariert istSTRICT
, häufig in die aufrufende Abfrage eingefügt werden, als ob sie auf jeder Referenz ausgeschrieben wäre.quelle