Страницы

Поиск по вопросам

четверг, 30 мая 2019 г.

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

Когда какую волатильность выставлять у функции (VOLATILE, STABLE, IMMUTABLE)?


Ответ

Документация оригинальная, пока актуальный перевод от российских контрибьютеров
Выставлять необходимо минимально необходимую. От этого зависит, что оптимизатор сможет полезного сделать. Например, выполнить функцию один раз заранее и потом пользоваться только результатом.
Изменчивая функция (VOLATILE) может делать всё, что угодно, в том числе, модифицировать базу данных. Она может возвращать различные результаты при нескольких вызовах с одинаковыми аргументами. Оптимизатор не делает никаких предположений о поведении таких функций. В запросе, использующем изменчивую функцию, она будет вычисляться заново для каждой строки, когда потребуется её результат. Стабильная функция (STABLE) не может модифицировать базу данных и гарантированно возвращает одинаковый результат, получая одинаковые аргументы, для всех строк в одном операторе. Эта характеристика позволяет оптимизатору заменить множество вызовов этой функции одним. В частности, выражение, содержащее такую функцию, можно безопасно использовать в условии поиска по индексу. (Так как при поиске по индексу целевое значение вычисляется только один раз, а не для каждой строки, использовать функцию с характеристикой VOLATILE в условии поиска по индексу нельзя.) Постоянная функция (IMMUTABLE) не может модифицировать базу данных и гарантированно всегда возвращает одинаковые результаты для одних и тех же аргументов. Эта характеристика позволяет оптимизатору предварительно вычислить функцию, когда она вызывается в запросе с постоянными аргументами. Например, запрос вида SELECT ... WHERE x = 2 + 2 можно упростить до SELECT ... WHERE x = 4, так как нижележащая функция оператора сложения помечена как IMMUTABLE. И ещё по таким функциям можно строить функциональные индексы.

Комментариев нет:

Отправить комментарий