Функции Postgres объявлены с классификацией волатильности VOLATILE
, STABLE
илиIMMUTABLE
. Известно, что проект очень строг с этими метками для встроенных функций. И не без причины. Показательный пример: индексы выражений допускают только IMMUTABLE
функции, и они должны быть действительно неизменными, чтобы избежать неверных результатов.
Пользовательские функции все еще могут быть объявлены по усмотрению владельца. Руководство советует:
Для достижения наилучших результатов оптимизации вы должны пометить свои функции категорией самой строгой волатильности, которая действительна для них.
... и добавляет обширный список вещей, которые могут пойти не так с неправильной меткой волатильности.
Тем не менее, есть случаи, когда имитация неизменности имеет смысл. Главным образом, когда вы знаете, что функция фактически неизменна в вашей области видимости. Пример:
За исключением всех возможных последствий для целостности данных , как это влияет на производительность? Можно предположить, что объявление функции IMMUTABLE
может быть полезным только для производительности . Это так?
Может ли объявление волатильности функций IMMUTABLE
повредить производительности?
Давайте предположим, что нынешний Postgres 10 сузит его, но все последние версии представляют интерес.
FORCE
что предполагается, что индексы выражений принимают неизменные функции (помечая их как потенциальную точку отказа). Да, это кажется более элегантным решением, чем обертки с неизменяемыми функциями.
FORCE
любом случае. 100% опытных администраторов баз данных PostgreSQL лгут, чтобы обойти этот пользовательский интерфейс с помощью функций-оболочек. По крайней мереFORCE
, нам не понадобятся обертки, и нам не придется лежать на объявленной волатильности.