Der Schaden von gespeicherten Prozeduren



Im Chat des Podcasts „Zinc Prod“ sie fallen gelassen einen Artikel darüber , wie einige Jungs übertragen alle die Business - Logik , um gespeicherte Prozeduren in pl / pgsql. Und da der Artikel viele Vorteile hatte, bedeutet dies, dass es Menschen gibt, und vielleicht sogar die Mehrheit von ihnen, die ein solches Refactoring positiv wahrgenommen haben.



Ich werde meine Gedanken nicht über den Baum verbreiten, sondern sofort eine Reihe von Nachteilen bei der Verwendung gespeicherter Prozeduren einbringen.



Nachteile gespeicherter Prozeduren



Versionierung



Wenn Sie im Fall von PHP-Code einfach zu einem anderen Zweig in Git wechseln und sehen können, was passiert ist, müssen die gespeicherten Prozeduren noch in die Datenbank verschoben werden. Und herkömmliche Migrationen helfen hier nicht weiter: Wenn Sie alle Änderungen als neues ERSTELLUNGS- ODER ERSETZUNGSVERFAHREN in den Speicher schreiben, wird die Codeüberprüfung die Hölle los sein: Es gibt immer eine neue Datei, mit der man sie nicht verstehen kann. Daher müssen Sie nach zusätzlichen Werkzeugen suchen oder Ihr Fahrrad schreiben.



Die pl / pgsql-Sprache selbst



Es ist eine veraltete Verfahrenssprache aus den neunziger Jahren, die sich überhaupt nicht weiterentwickelt hat. Kein OOP oder FP oder was auch immer. Syntax ohne den geringsten Hauch von syntaktischem Zucker.



Beispielsweise müssen Variablen zu Beginn einer Prozedur in einem speziellen DECLARE-Block deklariert werden. Dies ist, was unsere Großväter getan haben, es gibt eine gewisse Nostalgie für die Pascal-Sprache, aber danke, nicht im Jahr 2020.



Vergleichen Sie zwei Funktionen, die dasselbe in php und pl / pgsql tun:



CREATE OR REPLACE FUNCTION sum(x int, y int)
    RETURNS int
    LANGUAGE plpgsql
AS $$
DECLARE
    result int;
BEGIN
    result := x + y;
    return result;
END;
$$;


function sum(int $x, int $y): int
{
    $result = $x + $y;
    return $result;
}


Etwa 2-3 mal mehr kritzeln.



Auch die Sprache wird interpretiert, keine JIT usw. (Korrigieren Sie mich, wenn sich in den letzten Versionen etwas geändert hat). Jene. alles ist sehr langsam und traurig. Wenn Sie eine Art Speicher verwenden, dann in reinem SQL oder v8 (d. H. Javascript).



Debuggen



Glauben Sie mir, das Debuggen von PHP-Code ist 100500-mal einfacher. Sie haben gerade etwas korrigiert und das Ergebnis beobachtet. Sie können Echo überlagern oder sehen, was über xdebug direkt in der IDE vorhanden ist.



Das Debuggen gespeicherter Prozeduren ist unpraktisch. Dies muss in pgadmin erfolgen (durch Aktivieren einer speziellen Erweiterung). PgAdmin ist der Einfachheit halber weit von PHPstorm entfernt.



Protokollierung und Fehlerbehandlung



Vergessen Sie den schönen Json mit Spuren, die von stdout fallen, und dann zu Graylog und Wachposten. Und so geschieht dies alles automatisch und gibt dem Benutzer einen Fehler 500, wenn der Controller die Ausnahme nicht abfängt.



Im pl / pgsql-Speicher erledigen Sie alles manuell:



GET DIAGNOSTICS stack = PG_CONTEXT;

RAISE NOTICE E'--- ---\n%', stack;



Metriken sammeln



Sie können nicht wie in Golang einfach den Endpunkt /metrics hinzufügen, der von Prometheus eingesaugt wird, wo Sie das Geschäft und andere Metriken für die Überwachung überfüllen. Ich weiß nur nicht, wie ich mit pl / pgsql rauskomme.



Skalierung



Die Ausführung gespeicherter Prozeduren verschwendet Ressourcen (z. B. CPU) auf dem Datenbankserver. Bei anderen Sprachen können Sie die Logik auf andere Knoten verschieben.



Abhängigkeiten



In PHP können Sie mit dem Composer-Paketmanager die gewünschte Bibliothek in einem Zug aus dem Internet abrufen. Genau wie in js wird es npm sein, in Rust wird es Fracht sein, etc.



In der pl / pgsql-Welt muss man leiden. In dieser Sprache gibt es einfach keinen Abhängigkeitsmanager.



Frameworks



In der modernen Welt wird eine Webanwendung oft nicht von Grund auf neu geschrieben, sondern auf der Grundlage eines Frameworks unter Verwendung seiner Komponenten zusammengestellt. Auf Laravel sind beispielsweise Routing, Anforderungsvalidierung, Template-Engine, Authentifizierung / Autorisierung, 100.500 Helfer für alle Gelegenheiten usw. sofort einsatzbereit. Alles von Hand von Grund auf in einer veralteten Sprache zu schreiben - nein danke.



Es wird viele Fahrräder geben, die später gewartet werden müssen.



Unit-Tests



Es ist sogar schwer vorstellbar, wie bequem es ist, Unit-Tests in pl / pgsql-Stores zu organisieren. Ich habe es noch nie ausprobiert. Bitte teilen Sie in den Kommentaren.



Refactoring



Obwohl es eine IDE für die Arbeit mit einer Datenbank (Datagrip) gibt, sind Refactoring-Tools für gängige Sprachen viel umfangreicher. Alle Arten von Lintern, Tipps zur Vereinfachung des Codes usw.



Ein kleines Beispiel: In den Codeteilen, die ich am Anfang des Artikels angegeben habe, hat PHPStorm einen Hinweis gegeben, dass die Variable $resultoptional ist, und Sie können es einfach tun. return $x + $y;



Im Fall von plpgsql - Schweigen.



Vorteile gespeicherter Prozeduren



  1. Es gibt keinen Overhead für das Ansteuern von Zwischendaten entlang des Backend-DB-Pfads.
  2. Der Abfrageplan wird in gespeicherten Prozeduren zwischengespeichert, wodurch einige ms eingespart werden können. jene. Als Wrapper über eine Abfrage ist es manchmal sinnvoll, dies zu tun (in seltenen Fällen und nicht auf pl / pgsql, sondern auf Bare SQL), wenn eine rasende Hochlast vorliegt und die Abfrage selbst schnell ausgeführt wird.
  3. Wenn Sie Ihre Erweiterung für Postgres schreiben, können Sie nicht auf Speicher verzichten.
  4. Wenn Sie einige Daten aus Sicherheitsgründen ausblenden möchten, geben Sie der Anwendung nur Zugriff auf ein oder zwei Speicher (seltener Fall).


Schlussfolgerungen



Meiner Meinung nach werden gespeicherte Prozeduren nur in sehr, sehr seltenen Fällen benötigt, wenn Sie sicher sind, dass Sie überhaupt nicht darauf verzichten können. In anderen Fällen verkomplizieren Sie das Leben der Entwickler nur erheblich.



Ich würde verstehen, wenn im ursprünglichen Artikel ein Teil der Logik auf SQL übertragen wurde, kann dies verstanden werden. Aber warum die Lagerung ein Rätsel ist.



Ich würde mich freuen, wenn Sie denken, dass ich falsch liege, oder wenn Sie andere Situationen im Zusammenhang mit gespeicherten Prozeduren kennen (Vor- und Nachteile), und darüber in den Kommentaren schreiben.






All Articles