sql >> Databáze >  >> RDS >> PostgreSQL

Jak klíčová slova IMMUTABLE, STABLE a VOLATILE ovlivňují chování funkce?

Klíčové slovo IMMUTABLE je nikdy přidán automaticky pgAdmin nebo Postgres. Udělal to kdokoli, kdo funkci vytvořil nebo nahradil.

Správná volatilita pro danou funkci je VOLATILE (také výchozí), nikoli STABLE - nebo by nemělo smysl používat clock_timestamp() což je VOLATILE na rozdíl od now() nebo CURRENT_TIMESTAMP které jsou STABLE :ty vracejí stejné časové razítko v rámci stejné transakce. Manuál:

clock_timestamp() vrací aktuální aktuální čas, a proto se jeho hodnota mění i v rámci jediného SQL příkazu.

Manuál varuje, že volatilita funkce STABLE ...

je nevhodné pro AFTER spouštěče, které se chtějí dotazovat na řádky upravené aktuálním příkazem.

.. protože opakované vyhodnocení spouštěcí funkce může vrátit jiné výsledky pro stejný řádek. Tedy ne STABLE .

Ptáte se:

Máte představu, proč se funkce vrátila správně pětkrát, než zůstala u páté hodnoty, když je nastavena jako IMMUTABLE ?

Postgres Wiki:

Ve verzi 9.2 bude plánovač používat specifické plány týkající se odeslaných parametrů (dotaz bude naplánován při provádění), kromě případů, kdy je dotaz prováděn několikrát a plánovač rozhodne, že obecný plán není o moc dražší než konkrétní plány.

Odvážný důraz můj. Zdá se, že pro IMMUTABLE to nedává smysl funkce bez vstupních parametrů. Falešný štítek je však přepsán štítkem VOLATILE funkce v těle (prázdná vložená funkce ):jiný plán dotazů může stále dávat smysl. Související:

  • Výkon uložených procedur PostgreSQL

Na stranu

trunc() je o něco rychlejší než floor() a dělá totéž zde, protože kladná čísla jsou zaručena:

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



  1. Snímky databáze SQL Server -2

  2. Jak nastavit časovač pro volání funkce každých n minut?

  3. Neuspořádané výsledky v SQL

  4. Spustit spouštěč při aktualizaci sloupce A nebo ColumnB nebo ColumnC