*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 중국어 웹사이트의 기타 관련 기사를 참조하세요!