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