2013-02-21 2 views
1

저는 PostgreSQL 9.2.1을 실행 중이며 3 열을 반환하는 plpgsql 함수가 있습니다. 다음과 같이 호출되었습니다.여러 열을 반환하는 plpgsql 함수가 여러 번 호출됩니다.

SELECT (my_function(b.input)).*, a.other, b.columns 
FROM table_a a 
JOIN table_b b ON a.id = b.id 
WHERE ... 

이 함수는 WARNING 메시지를 출력하고 3 번 인쇄 된 것을보고 놀랐습니다. 함수가 3 번 호출되는 것처럼 보입니다 - 아마도 각 열에 대해 한 번. 이것은 성능에 좋을 수 없습니다! 한 번만 호출되도록하려면 어떻게해야합니까? 이미 STABLE로 표시되어 있습니다. 나는 그 경고를 한 번만 인쇄

SELECT * FROM my_function(input) 

로 부르지 만, 나는 내가 조인 및 기타 열을 반환에 더 큰 쿼리에 그것을 통합 할 수있는 방법을 모르는 경우

. 즉, FROM 목록에 다른 테이블이 필요할 때 함수를 FROM 목록에 넣는 방법을 모르며 그 함수는 그 테이블의 입력을 가져옵니다.

편집 :

(원래 훨씬 더 가까이) 조회 :

SELECT (my_aggregate_function(sub1.border, sub1.lower_limit, sub1.upper_limit, operation)).* 
FROM 
(
    SELECT (my_function(ca.timeslice_id)).*, agc.operation 
    FROM geometry_component agc 
    JOIN volume av ON agc.volume_id = av.id 
    JOIN volume_dependency avd ON av.contributor_id = avd.id 
    JOIN my_rowset_function('2013-02-22') ca ON avd.id = ca.feature_id 
    WHERE agc.timeslice_id = 12345 
    ORDER BY agc.sequence 
) sub1 

my_aggregate_functionmy_function은 각각 3 열 (테두리, lower_limit, UPPER_LIMIT)을 반환하지만, my_aggregate_function 집계이며, my_function은 일반적인 기능입니다.

+0

밀접하게 관련 질문 : http://stackoverflow.com/questions/14965708/insert-using-a-function-that-returns-two-values- 행당. 쿼리를 제공하십시오, 하위 쿼리를 구현할 수 있어야합니다. –

+0

링크를 제공해 주셔서 감사합니다. 그러나 그 점을 이해하지 못했습니다. 쿼리를 추가했습니다. – EM0

답변

2

이 작업을 수행해야합니다 어제

SELECT (y).* 
FROM (
    SELECT my_aggregate_function(border, lower_limit, upper_limit, operation) AS y 
    FROM (
     SELECT (x).*, operation 
     FROM (
     SELECT my_function(ca.timeslice_id) AS x, agc.operation 
     FROM geometry_component agc 
     JOIN volume    av ON av.id = agc.volume_id 
     JOIN volume_dependency avd ON avd.id = av.contributor_id 
     JOIN my_rowset_function('2013-02-22') ca ON ca.feature_id = avd.id 
     WHERE agc.timeslice_id = 12345 
     ORDER BY agc.sequence 
     ) sub1 
    )sub2 
    )sub3 
+0

감사합니다. Erwin, 당신은 PostgreSQL 질문에 대한 Jon Skeet입니다! – EM0

+0

PostgreSQL이 내부적으로 이렇게하지 않는 이유가 궁금합니다. 흥미롭게도 집계 함수는 여러 개의 열을 반환하더라도 위의 해결 방법없이 한 번만 호출되었습니다. 적어도 누적 기 함수는 행마다 한 번만 호출되었습니다. – EM0

+0

@EM : 아, Jon Skeet에게 얼마나 영광입니다! ;) 현재 버전에서는 쿼리 플래너의 취약점이라고 할 수 있습니다. Postgres 개발자들은 버전 9.3으로 ['LATERAL'] (http://www.depesz.com/2012/08/19/waiting-for-9-3-implement-sql-standard-language-subqueries/) 이런 종류의 문제에보다 효율적인 방법을 제공해야합니다. –

1

불행히도 구현의 일반적인 특징입니다. LATERAL에 대한 지원이 9.3을 사용하는 경우이 문제를 피할 수 있습니다.

현재로서는 적절한 해결 방법을 모르고 있습니다.

관련 문제