Категории изменчивости функций

Статья основана на одиннадцатом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK видео.

В данной статье подробно разбираются категории изменчивости функции, такие как IMMUTABLE, STABLE и VOLATILE.

В прошлой статье мы разобрали возвращение множеств(setof) из функции и таблиц(table).

Презентация и исходники доступны по ссылке.

Категории изменчивости функций

Параметры функции:

  • IMMUTABLE — кеширование
  • STABLE
  • VOLATILE (default)

IMMUTABLE показывает, что функция не может модифицировать базу данных и всегда возвращает один и тот же результат при определённых значениях аргументов.

Она не обращается к базе данных и не использует информацию, не переданную ей явно в списке аргументов. Если функция имеет такую характеристику, любой её вызов с аргументами-константами можно немедленно заменить значением функции.

STABLE показывает, что функция не может модифицировать базу данных и в рамках одного сканирования таблицы она всегда возвращает один и тот же результат для определённых значений аргументов, но этот результат может быть разным в разных операторах SQL.

Хороший выбор для функций, результаты которых зависят от содержимого базы данных и настраиваемых параметров (например, текущего часового пояса). Но этот вариант не подходит для триггеров AFTER, желающих прочитать строки, изменённые текущей командой.

VOLATILE показывает, что результат функции может меняться даже в рамках одного сканирования таблицы, так что её вызовы нельзя оптимизировать.

Изменчивы в этом смысле относительно немногие функции баз данных, например: random(), currval() и timeofday().

Важно, что любая функция с побочными эффектами должна быть классифицирована как изменчивая, даже если её результат вполне предсказуем, чтобы её вызовы не были соптимизированы — пример такой функции: setval().

Нюансы

STABLE и IMMUTABLE используют снимок, полученный в начале вызывающего запроса, тогда как функции VOLATILE получают свежий снимок в начале каждого запроса, который они выполняют из за особенностей реализации системы MVCC (https://aristov.tech/blog/mvcc-v-postgresql/ ).

Одна из распространённых ошибок — помечать функцию как IMMUTABLE, при том, что её результаты зависят от параметра конфигурации. Например, функция, работающая с временем, может выдавать результаты, зависящие от параметра зоны времени. Для надёжности такие функции следует помечать как STABLE.

Больше примеров доступно на гитхабе и в видео.

В следующей статье мы разберём составные типы данных и вычисляемые поля.


Опубликовано

в

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

восемнадцать − 7 =