Почему PostgreSQL вызывает мою функцию STABLE / IMMUTABLE несколько раз?

Я пытаюсь оптимизировать сложный запрос в 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

Почему это происходит и как я могу заставить его выполнить функцию только один раз?

16
задан EMP 16 December 2011 в 04:13
поделиться