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 条结果,只提出了一条通知

当我这样称呼它时:

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

我有 100 个结果和 100 个通知

添加条件 (table.hash = '3642e529-b098-4db4-b7e7-6bb62f8dcbba') 以确保 in 参数相同

table.hash 是 uuid 类型

问题是: 那么如何强制 PG 去一些如何缓存函数的结果呢?(如果可能的话)我只想在第二种情况下提出一个通知(函数调用)......

4

2 回答 2

2

在您的第一个示例get_data('3642e529-b098-4db4-b7e7-6bb62f8dcbba'::uuid)中,它是一个常量,独立于表行,因此它被评估一次

在第二个示例get_data(table.hash)中,在功能上取决于列值,因此每行评估一次

如果您想对函数进行一次评估,则它不能依赖于列中的值(当处理多行时)。


在评论中讨论之后,这里是一个示例,如何在每个哈希中只调用一次函数:

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

如果 Erwin 的回答不适合您的情况,您可以创建物化视图触发器来更新“计算列”

于 2012-12-26T14:57:19.247 回答