Postgres - Funktionen werden mit deklarierten Volatilität Klassifizierung VOLATILE
, STABLE
oderIMMUTABLE
. Es ist bekannt, dass das Projekt mit diesen Bezeichnungen für integrierte Funktionen sehr streng ist. Und das aus gutem Grund. Prominentes Beispiel: Ausdrucksindizes erlauben nur IMMUTABLE
Funktionen und diese müssen wirklich unveränderlich sein, um falsche Ergebnisse zu vermeiden.
Benutzerdefinierte Funktionen können weiterhin nach Wahl des Eigentümers deklariert werden. Das Handbuch empfiehlt:
Um optimale Optimierungsergebnisse zu erzielen, sollten Sie Ihre Funktionen mit der strengsten Volatilitätskategorie kennzeichnen, die für sie gültig ist.
... und fügt eine umfangreiche Liste von Dingen hinzu, die mit einem falschen Volatilitätsetikett schief gehen können.
Dennoch gibt es Fälle, in denen eine Fälschung der Unveränderlichkeit sinnvoll ist. Meistens, wenn Sie wissen, dass die Funktion in Ihrem Anwendungsbereich tatsächlich unveränderlich ist. Beispiel:
Abgesehen von allen möglichen Auswirkungen auf die Datenintegrität , wie wirkt sich dies auf die Leistung aus? Man könnte annehmen , eine Funktion deklarieren IMMUTABLE
kann nur von Vorteil sein , die Leistung . Ist das so?
Kann die Angabe der Funktionsvolatilität IMMUTABLE
die Leistung beeinträchtigen ?
Nehmen wir an, dass das aktuelle Postgres 10 eingrenzt, aber alle neueren Versionen sind von Interesse.
FORCE
, dass Ausdrucksindizes nicht unveränderliche Funktionen akzeptieren sollen (während sie als potenzieller Fehlerpunkt markiert werden). Ja, das scheint eine elegantere Lösung zu sein als unveränderliche Funktions-Wrapper.
FORCE
sie so oder so zu erreichen. 100% der erfahrenen PostgreSQL-Datenbankadministratoren arbeiten daran, diese Benutzeroberfläche mit Wrapper-Funktionen zu umgehen. Zumindest mitFORCE
würden wir keine Wrapper brauchen und wir müssten uns nicht auf die erklärte Volatilität von fn stützen.