sql >> データベース >  >> RDS >> PostgreSQL

IMMUTABLE、STABLE、およびVOLATILEキーワードは、関数の動作にどのように影響しますか?

    キーワードIMMUTABLE 決して pgAdminまたはPostgresによって自動的に追加されます。関数を作成または置換した人は誰でもそれを行いました。

    正しいボラティリティ 指定された関数の場合はVOLATILE (これもデフォルト)STABLEではありません -または、clock_timestamp()を使用しても意味がありません これはVOLATILE now()とは対照的 またはCURRENT_TIMESTAMP STABLEです :同じトランザクション内で同じタイムスタンプを返します。マニュアル:

    clock_timestamp() 実際の現在時刻を返すため、その値は単一のSQLコマンド内でも変更されます。

    マニュアルは、機能のボラティリティがSTABLEであることを警告しています。 ...

    AFTERには不適切です 現在のコマンドによって変更された行を照会するトリガー。

    ..トリガー関数を繰り返し評価すると異なるが返される可能性があるため 同じ行の結果。したがって、STABLEではありません 。

    あなたが尋ねる:

    IMMUTABLEとして設定されたときに、関数が5番目の値に固執する前に5回正しく返される理由についての考えがありますか? ?

    Postgres Wiki:

    9.2では、プランナーは、クエリが数回実行される場合を除いて、送信されるパラメーターに関して特定のプランを使用します(クエリは実行時に計画されます)。 計画担当者は、一般的な計画は特定の計画よりもそれほど高価ではないと判断します。

    大胆な強調鉱山。 IMMUTABLEには意味がないようです 入力パラメータなしで機能します。ただし、誤ったラベルはVOLATILEによって上書きされます 体内での機能(関数のインライン化を無効にします ):別のクエリプランでも意味があります。関連:

    • PostgreSQLストアドプロシージャのパフォーマンス

    trunc() floor()よりわずかに高速です 正の数が保証されているので、ここでも同じことをします:

    SELECT (trunc(EXTRACT(EPOCH FROM clock_timestamp()) * 10) - 13885344000)::int
    



    1. .NETを介したPL/SQLコレクション型パラメータを使用したOracleプロシージャの呼び出し

    2. mysqldumpのベストプラクティス:パート2 –移行ガイド

    3. 内部参加vsどこ

    4. SQLServerで日付と時刻をフォーマットする方法