PostgreSQL 9.2.1を実行していて、3列を返すplpgsql関数があります。これは次のように呼ばれます(簡略化):
SELECT (my_function(b.input)).*, a.other, b.columns
FROM table_a a
JOIN table_b b ON a.id = b.id
WHERE ...
この関数は警告メッセージを出力しますが、3回出力されていることに驚きました。関数は3回呼び出されるようです-おそらく各列に1回です。これはパフォーマンスには良くありません!一度だけ呼び出されるようにするにはどうすればよいですか?すでにSTABLEとマークされています。
私がそれを次のように呼ぶなら
SELECT * FROM my_function(input)
その場合、警告は1回だけ出力されますが、結合や他の列が返される大きなクエリにそれを統合する方法がわかりません。つまり、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_function
my_function
それぞれが3列(border、lower_limit、upper_limit)を返しますが、これはmy_aggregate_function
集計でmy_function
あり、通常の関数です。