Wichtige Änderungen an CTE in PostgreSQL 12

WITH w AS NOT MATERIALIZED ( SELECT * FROM very_very_big_table ) SELECT * FROM w AS w1 JOIN w AS w2 ON w1.key = w2.ref WHERE w2.key = 123; 

Heute ist ein Commit in das PostgreSQL-Repository gefallen, mit dem Sie das Verhalten der Verarbeitung von CTE-Unterabfragen steuern können: Sie können jetzt explizit angeben, ob die Unterabfrage separat materialisiert oder als Teil einer großen Abfrage ausgeführt wird.


Dies wird in PostgreSQL 12 gehen und das ist eine große Sache. Schauen wir uns an, warum


Programmierer lieben CTE, weil es die Lesbarkeit von Code erheblich verbessern kann. In der Tat können einige analytische Abfragen mit Dutzenden von Tabellen und verschiedenen Gruppierungen und Filtern funktionieren. All dies in einer großen Abfrage zu schreiben - garantiert etwas Unlesbares. Daher beschreiben wir mit dem WITH Operator nacheinander in kleinen Unterabfragen (die einen für Menschen lesbaren Namen erhalten) die Arbeitslogik und erzeugen dann das Ergebnis. Sehr bequem.


Genauer gesagt wäre es sehr praktisch, wenn es nicht eines gäbe: Das aktuelle PostgreSQL führt diese Unterabfragen getrennt voneinander aus, materialisiert sie (schreibt das Ergebnis in eine temporäre Tabelle). Dies kann zu einer deutlichen Verlangsamung im Vergleich zu einem großen unlesbaren Monster führen. Insbesondere, wenn CTE-Unterabfragen Millionen von Zeilen zurückgeben.


Es gibt jedoch Situationen, in denen eine solche separate Ausführung zum Guten funktioniert: Es gibt einen solchen Optimierungstrick, wenn es besser ist, einen Teil einer komplexen Anforderung separat auszuführen, aber die Postgres verstehen dies nicht alleine. Dann nehmen wir diesen Teil in der CTE-Unterabfrage heraus.


Im Allgemeinen sind die Situationen unterschiedlich, weshalb Postgres 12 ein Commit durchgeführt hat , bei dem die Schlüsselwörter MATERIALIZED und NOT MATERIALIZED , die angeben, ob die Abfrage bzw. die Inline materialisiert werden soll.


Darüber hinaus hat sich das Standardverhalten geändert. Jetzt wird die CTE-Unterabfrage standardmäßig inline geschaltet, wenn das Ergebnis einmal verwendet wird. Andernfalls wird es wie zuvor eintreten.

Source: https://habr.com/ru/post/de440576/


All Articles