Heim > Datenbank > MySQL-Tutorial > Warum verursacht „(func()).*' in PostgreSQL mehrere Funktionsauswertungen?

Warum verursacht „(func()).*' in PostgreSQL mehrere Funktionsauswertungen?

Linda Hamilton
Freigeben: 2025-01-10 11:37:42
Original
920 Leute haben es durchsucht

Why Does `(func()).*` in PostgreSQL Cause Multiple Function Evaluations?

*PostgreSQL-Leistungsproblem: Die „(func()).“-Syntax und redundante Funktionsaufrufe**

Dieser Artikel untersucht ein Leistungsproblem in PostgreSQL im Zusammenhang mit der (func()).*-Syntax bei Verwendung mit Funktionen, die zusammengesetzte Typen oder Mengen zurückgeben. Die ursprüngliche Beobachtung, die in der folgenden Abfrage gezeigt wird, verdeutlicht das unerwartete Verhalten:

<code class="language-sql">SELECT (func(3)).*; -- Leads to multiple function calls</code>
Nach dem Login kopieren

Das Problem: Übermäßige Funktionsbewertungen

Das Kernproblem besteht darin, dass (func()).* einen separaten Funktionsaufruf für jede Spalte in der Ausgabe der Funktion auslöst. Eine Funktion, die beispielsweise vier Spalten zurückgibt, könnte zu acht Funktionsaufrufen statt der erwarteten zwei führen. Dies steht in krassem Gegensatz zu alternativer Syntax, wie zum Beispiel:

<code class="language-sql">SELECT N, func(N); -- More efficient approach</code>
Nach dem Login kopieren

Lösung: Effizientes Umschreiben von Abfragen

Um die übermäßigen Aufrufe zu umgehen, bietet eine Unterabfrage einen Workaround. Obwohl dies im Allgemeinen effektiv ist, ist dies keine perfekte Lösung und kann zu anderen Leistungsaspekten führen.

Für PostgreSQL 9.3 und höher bietet das Schlüsselwort LATERAL eine überlegene Lösung:

<code class="language-sql">SELECT mf.*
FROM some_table
LEFT JOIN LATERAL my_func(some_table.x) AS mf ON true;</code>
Nach dem Login kopieren

Grundursache: PostgreSQL-Parser-Verhalten

Die Hauptursache liegt darin, wie der Parser von PostgreSQL mit dem Platzhalter * innerhalb des Konstrukts (func()).* umgeht. Die Wildcard-Erweiterung in einzelne Spalten beim Parsen ist die Ursache für die redundanten Funktionsaufrufe.

Leistungsbenchmark und Demonstration

Ein Beispiel für eine benutzerdefinierte Funktion zeigt die Leistungsdiskrepanz zwischen der problematischen Syntax und den vorgeschlagenen Problemumgehungen. Tests zeigen, dass der Unterabfrage-Ansatz (oder ein CTE) erhebliche Leistungsverbesserungen bietet.

Fazit: Optimierung von Abfragen in PostgreSQL

Während das Problem mit mehreren Funktionsaufrufen mit (func()).* weiterhin ein bekanntes Verhalten ist, bieten die Problemumgehungen, insbesondere die Verwendung von LATERAL (PostgreSQL 9.3), effektive Strategien für Entwickler, um die Abfrageleistung zu optimieren und unnötige Funktionsauswertungen zu reduzieren.

Das obige ist der detaillierte Inhalt vonWarum verursacht „(func()).*' in PostgreSQL mehrere Funktionsauswertungen?. 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