>데이터 베이스 >MySQL 튜토리얼 >PostgreSQL의 `(func()).*` 구문으로 다중 함수 평가를 피하는 방법은 무엇입니까?

PostgreSQL의 `(func()).*` 구문으로 다중 함수 평가를 피하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-10 12:00:04518검색

How to Avoid Multiple Function Evaluations with PostgreSQL's `(func()).*` Syntax?

PostgreSQL 쿼리 최적화: (func()).*

으로 중복 함수 호출 방지

PostgreSQL에서 (func()).* 구문을 사용하여 복합 유형을 반환하는 함수의 결과에 액세스하거나 TABLE을 사용하면 반복되는 함수 평가로 인해 성능 문제가 발생할 수 있습니다. 이는 구문이 여러 열 참조로 확장되어 각각 별도의 함수 호출을 트리거하기 때문에 발생합니다. 호출 횟수는 결과 집합의 열 수와 같습니다.

문제: 비효율적인 다중 함수 호출

(func()).* 접근 방식은 최소한의 함수 호출에 최적화되지 않기 때문에 비효율적입니다. 이상적으로는 전체 결과 세트를 검색하려면 함수를 한 번만 호출해야 합니다.

해결책:

PostgreSQL 9.3 이상에서는 LATERAL 조인:

을 사용하여 간단한 솔루션을 제공합니다.
<code class="language-sql">SELECT mf.*
FROM some_table
LEFT JOIN LATERAL my_func(some_table.x) AS mf ON true;</code>

LATERALmy_funcsome_table에서 행당 한 번만 실행되도록 보장하여 성능을 크게 향상시킵니다.

이전 PostgreSQL 버전(9.3 이전)의 경우 해결 방법이 필요합니다.

해결 방법 1: OFFSET 0 해킹

이 방법은 OFFSET 0 절을 활용하여 단일 함수 평가를 강제합니다.

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

해결 방법 2: 공통 테이블 표현식(CTE)

CTE는 더 깔끔한 대안을 제공합니다.

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

두 해결 방법 모두 my_func가 한 번만 호출되어 개별 열에 액세스하기 전에 전체 결과 집합을 검색하도록 합니다.

근본 원인: 파서 확장

다양한 평가는 PostgreSQL의 파서가 (func()).*을 해석하는 방식에 따라 발생합니다. 이를 별도의 열 액세스로 변환하여 여러 함수 호출이 발생합니다. 이 제한은 LATERAL 조인

도입으로 최신 버전에서 해결되었습니다.

위 내용은 PostgreSQL의 `(func()).*` 구문으로 다중 함수 평가를 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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