powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Про IMMUTABLE и STABLE
6 сообщений из 6, страница 1 из 1
Про IMMUTABLE и STABLE
    #38552805
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опытным путем получено, что immutale и stable работает только в том случае, если функция возвращает одно значение, если функция возвращает набор значений или таблицу, то это не работает.
В качестве теста использовались две функции, одна для изменения Volatility Categories, другая для вызова первой функции.

первая функция

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE FUNCTION public.test (
  id bigint
)
RETURNS SETOF bigint AS
$body$
DECLARE
  b bigint;
BEGIN
	with t1 as (
		select generate_series(1,1000) as a
	)
	select sum(a) from t1 into b;
    return query select b;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100 ROWS 1000;



вторая функция

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE FUNCTION public._performance_tasting_vorobyev (
)
RETURNS void AS
$body$
DECLARE
	q record;
BEGIN

  prepare t as 
     select test(10);
  FOR i IN 1..10000 LOOP
     execute 'execute t' into q;
  end LOOP;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;



Если в первой функции изменять тип возврата и Volatility Categories, то получаем см. первый абзац.
Можно, конечно, предположить почему так, но хотелось бы найти ответы в документации.
Или второй вариант, это не правильно поставлен эксперимент.
Прошу поделиться своими соображениями. Спасибо.
...
Рейтинг: 0 / 0
Про IMMUTABLE и STABLE
    #38552973
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

а какую ошибку оно у вас дает?

PS: для оптимизатора в любом случае IMMUTABLE информация полезна ТОЛЬКО для тех функций которые возращают одну строку... во всех остальных случаях от этой информации пользы ровно 0 потому наверное и не дают ставить.
...
Рейтинг: 0 / 0
Про IMMUTABLE и STABLE
    #38552974
As198
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IMHO, тест у вас некорректный.
Значение даже immutable-функции не запоминается между несколькими SQL-выражениями.
Но вывод правильный: результат функции типа set не кэшируется.

В документации это явно не указано, а из исходников видно
src/backend/optimizer/util/clauses.c
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
/*
 * evaluate_function: try to pre-evaluate a function call
 *
 * We can do this if the function is strict and has any constant-null inputs
 * (just return a null constant), or if the function is immutable and has all
 * constant inputs (call it and return the result as a Const node).  In
 * estimation mode we are willing to pre-evaluate stable functions too.
 *
 * Returns a simplified expression if successful, or NULL if cannot
 * simplify the function.
 */
...
	/*
	 * Can't simplify if it returns a set.
	 */
	if (funcform->proretset)
		return NULL;



Документации это не противоречит: там написано что оптимизатор *может* оптимизировать вызов функции, а не *должен* всегда это делать.

В большом/сложном запросе можно обернуть вызов функции в WITH или в подзапрос. Но и в этом случае гарантии однократного вызова оптимизатор не даёт.
...
Рейтинг: 0 / 0
Про IMMUTABLE и STABLE
    #38553059
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk а какую ошибку оно у вас дает?

В данном случае никаких ошибок не возникает. Варьируя Volatility Categories получается различный результат по производительности. В случаях когда функция возвращает одно значения - Volatility Categories играет роль, иначе эта функциональность не имеет никакой значимости.

As198IMHO, тест у вас некорректный.
Значение даже immutable-функции не запоминается между несколькими SQL-выражениями.

В документации написано, что immutable-функции выполняется на этапе построения плана запроса. В данном тесте функция вызывается при выполнении prepare, в цикле когда выполняется сам SELECT функция уже не вызывается, а используется закешированный результат, это очень хорошо видно, если сравнить время выполнения этой же самой функции, но как stable.
По времени это разница в десятки раз. Если изменить тип возврата на set или table, то результат выполнения двух типов функции становится одинаково медленный, т.е. похоже immutable функция в цикле вызывается всегда.
...
Рейтинг: 0 / 0
Про IMMUTABLE и STABLE
    #38553868
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trotВ случаях когда функция возвращает одно значения - Volatility Categories играет роль, иначе эта функциональность не имеет никакой значимостиОт волатильности ещё зависти какой снапшот будут использовать запросы в функции, основного запроса (immutable|stable) или постоянно обновляемый (volatile).
...
Рейтинг: 0 / 0
Про IMMUTABLE и STABLE
    #38556268
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot prepare t as
select test(10);
FOR i IN 1..10000 LOOP
execute 'execute t' into q;
end LOOP;


!!!


execute 'execute t'
!
Так вот как оно делается внутри pgplsql!

Извиняюся за оффтоп, не сдержался.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Про IMMUTABLE и STABLE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]