Las funciones de Postgres se declaran con clasificación de volatilidad VOLATILE
, STABLE
oIMMUTABLE
. Se sabe que el proyecto es muy estricto con estas etiquetas para las funciones integradas. Y con buen motivo. Ejemplo destacado: los índices de expresión solo permiten IMMUTABLE
funciones y esas deben ser verdaderamente inmutables para evitar resultados incorrectos.
Las funciones definidas por el usuario aún pueden declararse libremente según lo elija el propietario. El manual aconseja:
Para obtener los mejores resultados de optimización, debe etiquetar sus funciones con la categoría de volatilidad más estricta que sea válida para ellas.
... y agrega una extensa lista de cosas que pueden salir mal con una etiqueta de volatilidad incorrecta.
Aún así, hay casos en los que tiene sentido falsificar la inmutabilidad. Principalmente cuando sabe que la función es, de hecho, inmutable dentro de su alcance. Ejemplo:
Dejando a un lado todas las posibles implicaciones en la integridad de los datos , ¿cuál es el efecto en el rendimiento? Se podría suponer que declarar una función IMMUTABLE
solo puede ser beneficiosa para el rendimiento . ¿Es eso así?
¿La declaración de volatilidad de la función puede IMMUTABLE
dañar el rendimiento?
Supongamos que Postgres 10 actual lo reduce, pero todas las versiones recientes son de interés.
FORCE
se supone que los índices de expresión aceptan funciones no inmutables (al tiempo que los marcan como posibles puntos de falla). Sí, eso parecería una solución más elegante que los envoltorios de funciones inmutables.
FORCE
cualquier manera. El 100% de los DBA PostgreSQL experimentados mienten para evitar esa interfaz de usuario con funciones de contenedor. Al menos conFORCE
, no necesitaríamos envoltorios y no tendríamos que mentir sobre la volatilidad declarada de fn.