Overhead für prozedurale PostgreSQL-Sprachen (plpython / plsql / pllua…)


12

Ich versuche, Informationen über benutzerdefinierte PostgreSQL- Funktionen in der Leistung von prozeduralen Sprachen für Echtzeitaufgaben zu finden.

  1. Wie vergleichen sie sich mit eingebauten Funktionen?
  2. Gibt es einen Unterschied (im Overhead), wie Postgres die Funktionen plpython vs plpgsql vs pllua aufruft / verwaltet (ich interessiere mich für die Seite Postgres-Integration / Kontext / Datenübertragung, nicht für die VM selbst)?
  3. Ist der Kontext ein großer Aufwand? Kann ich es für die Echtzeit-Datenzuordnung verwenden (sagen wir 1000 Abfragen / s)?
  4. Gibt es einen Vorteil beim Schreiben benutzerdefinierter Funktionen in plpgsql als in anderen Seiten / Sprachen? In der Dokumentation werden die Vorteile aufgeführt, aber ich denke, sie gelten für alle postgresql-Verfahrenssprachen.

Verwandte Ergebnisse:

Antworten:


13
  1. UDFs in interpretierten Sprachen sind so gut wie immer langsamer als UDFs, die in C oder in integrierten Funktionen geschrieben sind, alle anderen Dinge sind gleich.

  2. Jede Sprachbindung verfügt über einen anderen Code, um PostgreSQL mit der Sprache zu verbinden, mit unterschiedlichen Optimierungsgraden, unterschiedlichen Arten der Übergabe einiger Datentypen usw. Es gibt also durchaus Unterschiede. Es sollte nicht riesig sein, es sei denn, Sie übergeben einen Datentyp, der von einer Sprache ganz anders behandelt wird als von einer anderen, z. B. einer übergibt einen hstoreals Zeichenfolge und ein anderer konvertiert ihn in einen dict.

  3. Unklar, was "der Kontext" ist. Können Sie es für die "Echtzeit-Datenzuordnung" verwenden? Nun, hängt davon ab, was die Funktion tut und ob sie auf dem Server, auf dem sie ausgeführt wird, für die Clients, auf die sie ausgeführt wird, und für Ihre Anforderungen schnell genug ist. Wie lang ist ein Stück Schnur? Benchmark.

  4. PL / PgSQL ist einfacher zu schreiben und bietet einen schnelleren Zugriff auf SQL. Im Allgemeinen ist es besser, wenn Sie ein wenig Logik um viel SQL wickeln müssen. Für mathematische Operationen und komplexe Algorithmen ist es sehr langsam, daher sollte rein rechnerischer Code in PL / PgSQL nach Möglichkeit zugunsten von C oder einer schnelleren prozeduralen Sprache vermieden werden.

Die Beschleunigung bei der erneuten Implementierung von PL / PgSQL-Code in C kann von vernachlässigbar bis über 1000-mal variieren. Es hängt alles davon ab, was der Code tatsächlich tut.

(Diese Art von Mehrfachfragen eignet sich nicht gut für Stack Exchange, da es schwieriger ist, eine endgültige Antwort zu erhalten.)


Mit Kontext meine ich alle Daten, die hin und her in eine prozedurale Umgebung übertragen werden müssen
Robert Zaremba

4

das ist ziemlich schwer zu sagen. Es hängt wirklich davon ab, was Sie tun. Zum Beispiel: PL / pgSQL ist wunderbar, wenn Sie große SQL-Anweisungen enthalten - es wird wirklich verrückt, wenn Sie alle Arten von Verzweigungen, Teilzeichenfolgenverwaltung und all das haben.

Sie müssen wirklich von Fall zu Fall testen.


4

Ist der Kontext ein großer Aufwand? Kann ich es für die Echtzeit-Datenzuordnung verwenden (sagen wir 1000 Abfragen / s)?

Die Leistung hängt von der Hardware und der Komplexität Ihrer Funktionen ab. Ich habe eine Appliance erstellt, die auf einem kleinen 12-Core-Server und einer FusionIO-Karte lief (Gesamtkosten 10000 Euro) und ungefähr 2500 Transaktionen pro Sekunde mit 20 gleichzeitigen Benutzern durchgeführt. Jede Transaktion ruft 29 gespeicherte Prozeduren auf, um die Daten zu verarbeiten und einige nützliche Informationen an den Client zurückzugeben. Einige Funktionen führen nur eine Abfrage aus, andere einige Abfragen. Insgesamt werden ungefähr 200000 INSERT-, SELECT- und UPDATE-Anweisungen pro Sekunde ausgeführt.

Dies ist alles in PL / SQL, PL / pgSQL und PL / PerlU geschrieben. Und ich bin mir ziemlich sicher, dass das System noch schneller laufen kann, wenn (einige) Funktionen in C neu geschrieben werden.

In dieser Appliance kommt die meiste Leistung von der SSD-Karte. Auf einer einzelnen rotierenden Scheibe würden wir diese Leistung niemals erzielen. Günstige SSD-Laufwerke fallen ebenfalls aus, sie funktionieren eine Stunde lang (aufgrund des Zwischenspeicherns der RAID-Karte) und dann ist das Spiel vorbei. Die FusionIO-Karte ist teuer, aber eine sehr gute Investition, wenn Sie IO-gebunden sind.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.