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
Freigeben: 2024-12-26 20:52:10
Original
161 Leute haben es durchsucht

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
...
Nach dem Login kopieren

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) 
Nach dem Login kopieren

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
Nach dem Login kopieren

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;
Nach dem Login kopieren

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)
Nach dem Login kopieren

oder die entsprechende Kurzform:

, foo(sub.arr)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage