Heim >Datenbank >MySQL-Tutorial >Wie kann LATERAL JOIN von PostgreSQL mehrere Funktionsaufrufe für Array-Argumente optimieren?

Wie kann LATERAL JOIN von PostgreSQL mehrere Funktionsaufrufe für Array-Argumente optimieren?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-26 20:52:10154Durchsuche

How Can PostgreSQL's LATERAL JOIN Optimize Multiple Function Calls on Array Arguments?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn