我正在尝试优化PostgreSQL 9.1.2中的复杂查询,它调用了一些函数.这些函数标记为STABLE或IMMUTABLE,并在查询中使用相同的参数多次调用.我假设PostgreSQL足够智能,只能为每组输入调用一次 - 毕竟,这是STABLE和IMMUTABLE的重点,不是吗?但似乎多次调用这些函数.我写了一个简单的函数来测试它,它证实了这一点:
CREATE OR REPLACE FUNCTION test_multi_calls1(one integer)
RETURNS integer
AS $BODY$
BEGIN
RAISE NOTICE 'Called with %', one;
RETURN one;
END;
$BODY$ LANGUAGE plpgsql IMMUTABLE;
WITH data AS
(
SELECT 10 AS num
UNION ALL SELECT 10
UNION ALL SELECT 20
)
SELECT test_multi_calls1(num)
FROM data;
Run Code Online (Sandbox Code Playgroud)
输出:
NOTICE: Called with 10
NOTICE: Called with 10
NOTICE: Called with 20
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?如何让它只执行一次该功能?