Heim >Datenbank >MySQL-Tutorial >Wie kann LATERAL JOIN von PostgreSQL mehrere Funktionsaufrufe für Array-Argumente optimieren?
Abfrageoptimierung für mehrere Funktionsaufrufe für Array-Argumente
In Postgres kann es ineffizient sein, eine Funktion mehrmals für ein Array-Argument aufzurufen , insbesondere wenn die Funktion mehrere Spalten zurückgibt. Lassen Sie uns eine Strategie zur Abfrageoptimierung untersuchen, um dieser Herausforderung zu begegnen.
Stellen Sie sich eine Funktion foo vor, die ein Array von Zeilen mit einem bestimmten Parameter verarbeitet und eine Reihe von Zeilen sowie eine neue Spalte zurückgibt:
CREATE OR REPLACE FUNCTION foo(data data[], parameter int) RETURNS SETOF enhanceddata AS ...
Zunächst funktioniert die Funktion mit einem einzelnen Datensatz unter Verwendung von:
SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1)
Das Ziel besteht jedoch darin, sie für mehrere Datengruppen ohne zu funktionieren Angabe eines dataid-Parameters.
Ein Ansatz besteht darin, eine Unterabfrage zu verwenden, um die Daten in einem Array zusammenzufassen und sie dann an die foo-Funktion zu übergeben:
SELECT dataid, (foo(ARRAY_AGG(data)),1).* FROM dataset WHERE dataid = something -- only testing on 1 GROUP BY dataid
Obwohl dies logisch erscheinen mag, ist es problematisch aus dem Problem, foo mehrmals aufzurufen, einen für jede Datenzeile.
Verwenden von Lateral Join für Optimierung
Um diese Abfrage zu optimieren, kann der PostgreSQl LATERAL JOIN verwendet werden. Diese leistungsstarke Technik erstellt ein zeilenbasiertes kartesisches Produkt zwischen den Ergebnissen einer Unterabfrage und den Zeilen einer anderen Tabelle. In diesem Fall aggregiert die Unterabfrage die Daten in einem Array und der laterale Join führt foo einmal für jede Zeile im aggregierten Array aus.
Mit PostgreSQL 9.3 oder höher optimiert die folgende Abfrage die mehreren Funktionsaufrufe:
SELECT sub.dataid, f.* FROM ( SELECT dataid, array_agg(data) AS arr FROM dataset WHERE dataid = something GROUP BY 1 ) sub LEFT JOIN LATERAL foo(sub.arr) f ON true;
Der LEFT JOIN LATERAL stellt sicher, dass alle Zeilen aus der linken Tabelle (Unterabfrage) erhalten bleiben, auch wenn von keine Zeilen zurückgegeben werden foo. Wenn die Funktion keine Zeilen zurückgeben kann, ist dies die bevorzugte Syntax.
Für Funktionen, die immer ein Ergebnis zurückgeben, kann die vereinfachte Syntax verwendet werden:
CROSS JOIN LATERAL foo(sub.arr)
oder die entsprechende Kurzform:
, foo(sub.arr)
Wie im Postgres-Handbuch hervorgehoben, optimiert die Verwendung von LATERAL JOIN Abfragen mit Mengen zurückgebenden Funktionen wie foo. Diese Technik verarbeitet effizient mehrere Datengruppen, ohne dass unnötige Funktionsauswertungen erforderlich sind.
Das obige ist der detaillierte Inhalt vonWie kann LATERAL JOIN von PostgreSQL mehrere Funktionsaufrufe für Array-Argumente optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!