Статья основана на одиннадцатом видео из 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.
Больше примеров доступно на гитхабе и в видео.
В следующей статье мы разберём составные типы данных и вычисляемые поля.
Добавить комментарий