Postgresの機能を使用して宣言されている揮発性の分類VOLATILE
、STABLE
またはIMMUTABLE
。プロジェクトは、組み込み関数のこれらのラベルで非常に厳しいことが知られています。そして正当な理由があります。顕著な例:式のインデックスはIMMUTABLE
関数のみを許可し、誤った結果を回避するためにそれらは真に不変でなければなりません。
ユーザー定義関数は、所有者の選択に従って自由に宣言できます。マニュアルは助言します:
最適化の最良の結果を得るには、関数に有効な最も厳密なボラティリティカテゴリで関数にラベルを付けてください。
...そして、不適切なボラティリティラベルで問題が発生する可能性のあるものの広範なリストを追加します。
それでも、不変性を偽ることが理にかなっている場合があります。あなたがするとき、ほとんど知っている機能は、実際には、あなたの範囲内で不変です。例:
データの整合性に関する考えられるすべての影響はさておき、パフォーマンスへの影響は何ですか?関数の宣言はパフォーマンスにのみ有益であると考える人もいるかもしれません。そうですか?IMMUTABLE
関数のボラティリティIMMUTABLE
を宣言するとパフォーマンスが低下しますか?
現在のPostgres 10でそれを絞り込むと仮定しますが、最近のすべてのバージョンが対象です。
FORCE
は、式のインデックスが不変でない関数を受け入れるようにすることを想定している(それらを潜在的な障害点としてマークしながら)。はい、それは不変の関数ラッパーよりもエレガントなソリューションのように思えます。
FORCE
どちらにせよ、彼らにできるはずです。経験豊富なPostgreSQL DBAの100%は、ラッパー関数でそのUIを回避しています。少なくともFORCE
を使用すれば、ラッパーは不要であり、宣言されたfnボラティリティに依存する必要もありません。