postgres の plpgsql 関数について助けが必要です。この質問は psql-general で決定的な回答なしで尋ねられました (こことここ)
これは次のように要約されます。
配列を使用せずに、一連の行を入力として、一連の行を出力として plpgsql 関数を作成する方法(パフォーマンスのため)。
SELECT ...hard_work...
現在、カーソルの参照として入力を送信していますが、同じクエリを 2 回計算する必要があり ( )、アプリケーションでトランザクションを台無しにするため、満足のいくものではありません。
現在、次のように機能します。
DECLARE cursor FOR ...hardwork...;
WITH first_query AS (
SELECT ...hard_work... --second computation of hard_work
),
second_query AS (
SELECT ...another_query_using_hard_work...
)
SELECT *
FROM my_function('cursor'::refcursor) f(...) ;
最終的には(動作しない)のようなものが欲しい
WITH first_query AS (
SELECT ...hard_work...
),
second_query AS (
SELECT ...another_query_using_the_hard_work_query...
)
SELECT *
FROM my_function('first_query'::regclass) f(...) ;
もちろん、 SELECT ...hard_work... はコストがかかる (約 50ms) ため、2 回計算しない方がよいでしょう。アプリケーションはデータ ストリーミングであるため、時間は貴重であり、データは重いため、一時テーブルにデータをコピーすることは、2 回計算するよりも悪い場合があります (通常は数十 MB )。
他の解決策が提案された
ビューまたはテーブル参照を入力として送信します。これは、カーソルを使用するのと同じ問題です (つまり、2 倍の計算、別のステートメント)
配列の送信/出力 : array_agg() と unnest() で多くの計算を強制します
一時テーブルの送信: データのコピーが含まれます: 2 回計算するよりも長くなる可能性があります (私は 50 ミリ秒のために戦っています)
マテリアライズド ビューの送信: 9.3 でのみ使用可能
このテーマについての高度な洞察を得ることができて非常に感謝しています。
よろしくお願いします、
レミC
PS : psql-general メーリング リストの質問へのリンクには、特定のコードやすべてのコードに関する多くの詳細が含まれています。
PPS:バージョン: postgres 9.2 . OS : Ubuntu 12.04 LTE、クライアント : テスト用の PGAdmin3、本番用の node.js。