Я пытаюсь оптимизировать сложный запрос в 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;
Вывод:
NOTICE: Called with 10
NOTICE: Called with 10
NOTICE: Called with 20
Почему это происходит и как я могу заставить его выполнить функцию только один раз?