Heim >Datenbank >MySQL-Tutorial >Wie vermeide ich mehrere Funktionsauswertungen mit der „(func()).*'-Syntax von PostgreSQL?
(func()).*
Die Verwendung der (func()).*
-Syntax in PostgreSQL für den Zugriff auf Ergebnisse einer Funktion, die einen zusammengesetzten Typ zurückgibt, oder TABLE
kann aufgrund wiederholter Funktionsauswertungen zu Leistungsproblemen führen. Dies liegt daran, dass die Syntax in mehrere Spaltenverweise erweitert wird, die jeweils einen separaten Funktionsaufruf auslösen. Die Anzahl der Aufrufe entspricht der Anzahl der Spalten im Ergebnissatz.
Das Problem:Ineffiziente Mehrfachfunktionsaufrufe
Der (func()).*
-Ansatz ist ineffizient, da er nicht für minimale Funktionsaufrufe optimiert ist. Idealerweise sollte die Funktion nur einmal aufgerufen werden, um die gesamte Ergebnismenge abzurufen.
Lösungen:
PostgreSQL 9.3 und höher bieten eine unkomplizierte Lösung mit LATERAL
Joins:
<code class="language-sql">SELECT mf.* FROM some_table LEFT JOIN LATERAL my_func(some_table.x) AS mf ON true;</code>
LATERAL
stellt sicher, dass my_func
nur einmal pro Zeile in some_table
ausgeführt wird, was die Leistung erheblich verbessert.
Für ältere PostgreSQL-Versionen (vor 9.3) sind Problemumgehungen erforderlich:
Problemumgehung 1: OFFSET 0
Hack
Diese Methode nutzt die OFFSET 0
-Klausel, um eine einzelne Funktionsauswertung zu erzwingen:
<code class="language-sql">SELECT (mf).* FROM ( SELECT my_func(x) AS mf FROM some_table OFFSET 0 ) sub;</code>
Problemumgehung 2: Common Table Expression (CTE)
Ein CTE bietet eine sauberere Alternative:
<code class="language-sql">WITH tmp AS ( SELECT my_func(x) FROM some_table ) SELECT (mf).* FROM tmp;</code>
Beide Problemumgehungen stellen sicher, dass my_func
nur einmal aufgerufen wird und die vollständige Ergebnismenge abgerufen wird, bevor auf einzelne Spalten zugegriffen wird.
Grundursache:Parser-Erweiterung
Die mehrfachen Auswertungen ergeben sich daraus, wie der Parser von PostgreSQL (func()).*
interpretiert. Dies wird in separate Spaltenzugriffe übersetzt, was zu mehreren Funktionsaufrufen führt. Diese Einschränkung wurde in neueren Versionen mit der Einführung von LATERAL
Joins.
Das obige ist der detaillierte Inhalt vonWie vermeide ich mehrere Funktionsauswertungen mit der „(func()).*'-Syntax von PostgreSQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!