3

関数を使用して posgresql の選択を固定しようとしているのは、不変または安定していると言って関数を持っているためです

CREATE OR REPLACE FUNCTION get_data(uid uuid)
RETURNS integer AS $$
BEGIN
    RAISE NOTICE 'UUID %', $1;
-- DO SOME STUFF
    RETURN 0;

END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;

次のように呼び出すと:

SELECT get_data('3642e529-b098-4db4-b7e7-6bb62f8dcbba'::uuid)
  FROM table
 WHERE true LIMIT 100;

100 件の結果があり、1 件の通知のみが発生しました

このように呼び出すと:

SELECT get_data(table.hash)
  FROM table
 WHERE 1 = 1 AND table.hash = '3642e529-b098-4db4-b7e7-6bb62f8dcbba' LIMIT 100;

100 件の結果と 100 件の通知があります

in パラメーターが同じであることを確認するために条件 (table.hash = '3642e529-b098-4db4-b7e7-6bb62f8dcbba') が追加されました

table.hash は uuid タイプです

質問は次のとおりです。 では、関数の結果をキャッシュする方法を PG に強制するにはどうすればよいでしょうか。(可能であれば)2番目のケースで通知(関数呼び出し)を1つだけ発生させたい...

4

2 に答える 2

2

最初の例get_data('3642e529-b098-4db4-b7e7-6bb62f8dcbba'::uuid)では、テーブルの行に関係なく定数であるため、一度評価されます。

2 番目の例get_data(table.hash)では、機能的に列の値に依存しているため、行ごとに 1 回評価されます。

関数を 1 回評価する場合、列の値に依存することはできません (複数の行が処理される場合)。


コメントで議論した後、ハッシュごとに一度だけ関数を呼び出す方法の例を次に示します。

SELECT *, get_data(x.hash) AS some_data_once_per_hash
FROM    (
    SELECT hash, count(*) AS ct
    FROM   table
    WHERE  table.hash = '3642e529-b098-4db4-b7e7-6bb62f8dcbba'
    GROUP  BY 1
    ) x
于 2012-12-26T14:35:49.330 に答える
0

アーウィンの答えがあなたのケースに合わない場合は、マテリアライズド・ビューまたはトリガーを作成して「計算された列」を更新することができます

于 2012-12-26T14:57:19.247 に答える