>데이터 베이스 >MySQL 튜토리얼 >이전 PostgreSQL 버전에서 `(func()).*`를 사용한 다중 함수 호출을 방지하는 방법은 무엇입니까?

이전 PostgreSQL 버전에서 `(func()).*`를 사용한 다중 함수 호출을 방지하는 방법은 무엇입니까?

DDD
DDD원래의
2025-01-10 10:57:42424검색

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

이전 PostgreSQL 버전에서 (func()).*을 사용한 반복 함수 호출 방지

이슈

9.3 이전 버전의 PostgreSQL에서 (func()).* 구문(func이 테이블을 반환하는 경우)을 사용하면 함수가 의도치 않게 여러 번 실행될 수 있습니다. 이는 쿼리 성능에 큰 영향을 미칩니다.

솔루션

이 문제를 효과적으로 우회하는 방법은 다음과 같습니다.

1. 하위 쿼리 접근 방식:

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

2. 오프셋 0 기술:

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

3. CTE(공통 테이블 표현식) 접근 방식:

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

4. 측면 조인(PostgreSQL 9.3 이상):

<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>

위 내용은 이전 PostgreSQL 버전에서 `(func()).*`를 사용한 다중 함수 호출을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.