1

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_functionmy_functionそれぞれが3列(border、lower_limit、upper_limit)を返しますが、これはmy_aggregate_function集計でmy_functionあり、通常の関数です。

4

2 に答える 2

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
于 2013-02-22T13:13:55.780 に答える
1

残念ながら、それは実装の通常の癖です。LATERAL9.3でクエリのサポートが開始されると、この問題を回避できるようになります。

今のところ、私は良い回避策を認識していません。

于 2013-02-21T09:58:24.680 に答える