Heim > Datenbank > MySQL-Tutorial > Wie verhindert man mehrere Funktionsaufrufe mit „(func()).*' in älteren PostgreSQL-Versionen?

Wie verhindert man mehrere Funktionsaufrufe mit „(func()).*' in älteren PostgreSQL-Versionen?

DDD
Freigeben: 2025-01-10 10:57:42
Original
422 Leute haben es durchsucht

How to Prevent Multiple Function Calls with `(func()).*` in Older PostgreSQL Versions?

Vermeiden wiederholter Funktionsaufrufe mit (func()).* in älteren PostgreSQL-Versionen

Das Problem

In PostgreSQL-Versionen vor 9.3 kann die Verwendung der (func()).*-Syntax (wobei func eine Tabelle zurückgibt) zu unbeabsichtigten Mehrfachausführungen der Funktion führen. Dies wirkt sich erheblich auf die Abfrageleistung aus.

Lösungen

Mehrere Methoden umgehen dieses Problem effektiv:

1. Unterabfrageansatz:

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

2. OFFSET 0-Technik:

<code class="language-sql">SELECT (mf).* FROM (
    SELECT my_func(x) AS mf FROM some_table OFFSET 0
) sub;</code>
Nach dem Login kopieren

3. CTE-Ansatz (Common Table Expression):

<code class="language-sql">WITH tmp(mf) AS (
    SELECT my_func(x) FROM some_table
)
SELECT (mf).* FROM tmp;</code>
Nach dem Login kopieren

4. LATERAL JOIN (PostgreSQL 9.3 und höher):

<code class="language-sql">
SELECT mf.*
FROM some_table
LEFT JOIN LATERAL my_func(some_table.x) AS mf ON true;
```  This is the preferred method for PostgreSQL 9.3 and above.


### Explanation

The root cause lies in how PostgreSQL's parser handles `(func()).*` in older versions.  The wildcard expands into individual column selections, mistakenly causing the function to be called repeatedly for each column.


### Why Repeated Calls Occur

Pre-9.3 PostgreSQL parsers interpret `(func()).*` by replicating nodes within the parse tree.  This replication results in a separate function call for every selected column, even if a single call would suffice.</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie verhindert man mehrere Funktionsaufrufe mit „(func()).*' in älteren PostgreSQL-Versionen?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage