Les fonctions Postgres sont déclarées avec une classification de volatilité VOLATILE
, STABLE
ouIMMUTABLE
. Le projet est connu pour être très strict avec ces étiquettes pour les fonctions intégrées. Et pour cause. Exemple frappant: les index d'expression n'autorisent que les IMMUTABLE
fonctions et celles-ci doivent être vraiment immuables pour éviter des résultats incorrects.
Les fonctions définies par l'utilisateur sont toujours libres d'être déclarées selon le choix du propriétaire. Le manuel conseille:
Pour de meilleurs résultats d'optimisation, vous devez étiqueter vos fonctions avec la catégorie de volatilité la plus stricte qui leur est valable.
... et ajoute une longue liste de choses qui peuvent mal tourner avec une étiquette de volatilité incorrecte.
Pourtant, il existe des cas où la simulation de l'immuabilité a un sens. Surtout quand vous savez que la fonction est, en fait, immuable dans votre portée. Exemple:
Toutes les implications possibles sur l'intégrité des données mises à part , quel est l'effet sur les performances? On pourrait supposer que déclarer une fonction IMMUTABLE
ne peut être que bénéfique pour les performances . Est-ce vrai?
La déclaration de la volatilité des fonctions peut-elle IMMUTABLE
nuire aux performances?
Supposons que Postgres 10 actuel le réduise, mais toutes les versions récentes sont intéressantes.
FORCE
c'est censé faire en sorte que les index d'expression acceptent des fonctions non immuables (tout en les marquant comme point de défaillance potentiel). Oui, cela semble être une solution plus élégante que les wrappers de fonctions immuables.
FORCE
les deux cas. 100% des administrateurs de bases de données PostgreSQL expérimentés mentent pour contourner cette interface utilisateur avec des fonctions d'encapsulation. Au moins avecFORCE
, nous n'aurions pas besoin de wrappers et nous n'aurions pas à mentir sur la volatilité fn déclarée.