IMMUTABLE関数、VOLATILE関数、STABLE関数の定義の本当の意味は不明です。
私はドキュメント、特にそれぞれの定義を読みました。
IMMUTABLEは、関数がデータベースを変更できないことを示し 、同じ引数値が指定された場合は常に同じ結果を返します。つまり、データベースの検索や、引数リストに直接存在しない情報の使用は行いません。このオプションを指定すると、引数がすべて定数の関数の呼び出しはすべて、関数の値ですぐに置き換えることができます。
STABLEは、関数がデータベースを変更できず、単一のテーブルスキャン内で同じ引数値に対して常に同じ結果を返すが、その結果はSQLステートメント間で変わる可能性があることを示します。これは、データベースルックアップ、パラメーター変数(現在のタイムゾーンなど)などに依存する結果を持つ関数の適切な選択です(現在のコマンドによって変更された行をクエリするAFTERトリガーには不適切です)。 current_timestamp関数ファミリーは、トランザクション内で値が変化しないため、安定と見なされます。
VOLATILEは、関数の値が単一のテーブルスキャン内でも変更される可能性があるため、最適化を実行できないことを示します。この意味で揮発性であるデータベース関数は比較的少数です。いくつかの例は、random()、currval()、timeofday()です。ただし、副作用がある関数は、その結果がかなり予測可能であっても、呼び出しが最適化されないように、揮発性に分類する必要があることに注意してください。例はsetval()です。
私の混乱は不変の条件と機能が安定したとしていますALWAYSまたは一貫して同じ引数与えられた同じ結果を返します。
IMMUTABLE定義は、関数がデータベース検索を行わないか、引数リストに直接存在しない情報を使用しないことを示しています。つまり、私にとっては、そのような関数はクライアントから提供されたデータを操作するために使用され、SELECTステートメントを含むべきではないということです...
STABLEの場合、定義は同じですが、常に同じ結果を返す必要があると述べています。つまり、私にとっては、関数が同じ引数で呼び出されるたびに、同じ結果を返す必要があります(まったく同じ行、毎回)。
したがって、私にとって...つまり、更新可能な1つまたは複数のテーブルに対してSELECTを実行する関数は、揮発性でなければならないということです。
しかし、再び...それは私には正しく聞こえません。
これを私のユースケースに戻すと、常に追加されているテーブルで複数のJOINを使用してSELECTステートメントを実行する関数を書いているので、同じ引数を使用しても、関数呼び出しは呼び出されるたびに異なる結果を返すことが期待されます。
それで、それは私の機能が揮発性であるべきであることを意味しますか?ドキュメントは、この意味で揮発性であるデータベース関数が比較的少ないことを示していますが?
ありがとうございました!