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