> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL의 `(func()).*`가 ​​다중 함수 평가를 발생시키는 이유는 무엇입니까?

PostgreSQL의 `(func()).*`가 ​​다중 함수 평가를 발생시키는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-10 11:37:42
원래의
920명이 탐색했습니다.

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

*PostgreSQL 성능 문제: `(func()).` 구문 및 중복 함수 호출**

이 기사에서는 복합 유형이나 세트를 반환하는 함수와 함께 사용할 때 (func()).* 구문과 관련된 PostgreSQL의 성능 문제를 조사합니다. 아래 쿼리에 표시된 원래 관찰은 예상치 못한 동작을 강조합니다.

<code class="language-sql">SELECT (func(3)).*; -- Leads to multiple function calls</code>
로그인 후 복사

문제: 과도한 기능평가

핵심 문제는 (func()).*이 함수 출력의 열에 대해 별도의 함수 호출을 트리거한다는 것입니다. 예를 들어, 4개의 열을 반환하는 함수는 예상되는 2개의 함수 호출 대신 8개의 함수 호출을 초래할 수 있습니다. 이는 다음과 같은 대체 구문과 뚜렷하게 대조됩니다.

<code class="language-sql">SELECT N, func(N); -- More efficient approach</code>
로그인 후 복사

솔루션: 효율적인 쿼리 재작성

과도한 호출을 피하기 위해 하위 쿼리가 해결 방법을 제공합니다. 일반적으로 효과적이지만 완벽한 솔루션은 아니며 다른 성능 고려 사항이 발생할 수 있습니다.

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>
로그인 후 복사

근본 원인: PostgreSQL 파서 동작

근본 원인은 PostgreSQL의 파서가 * 구문 내에서 (func()).* 와일드카드를 처리하는 방식에 있습니다. 구문 분석 중 개별 열로의 와일드카드 확장은 중복 함수 호출의 원인입니다.

성능 벤치마크 및 시연

사용자 정의 함수 예는 문제가 있는 구문과 제안된 해결 방법 간의 성능 불일치를 보여줍니다. 테스트 결과 하위 쿼리 접근 방식(또는 CTE)이 상당한 성능 향상을 제공하는 것으로 나타났습니다.

결론: PostgreSQL의 쿼리 최적화

(func()).*의 다중 함수 호출 문제는 여전히 알려진 동작이지만, 특히 LATERAL(PostgreSQL 9.3)을 사용하는 해결 방법은 개발자가 쿼리 성능을 최적화하고 불필요한 함수 평가를 줄일 수 있는 효과적인 전략을 제공합니다.

위 내용은 PostgreSQL의 `(func()).*`가 ​​다중 함수 평가를 발생시키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿