집 >데이터 베이스 >MySQL 튜토리얼 >PostgreSQL의 `(func()).*` 구문으로 다중 함수 평가를 피하는 방법은 무엇입니까?
(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>
LATERAL
은 my_func
이 some_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 중국어 웹사이트의 기타 관련 기사를 참조하세요!