Słowo kluczowe IMMUTABLE
jest nigdy dodawane automatycznie przez pgAdmin lub Postgres. Ktokolwiek stworzył lub zastąpił tę funkcję, zrobił to.
Prawidłowa zmienność dla danej funkcji jest VOLATILE
(również domyślne), a nie STABLE
- albo nie ma sensu używać clock_timestamp()
który jest VOLATILE
w przeciwieństwie do now()
lub CURRENT_TIMESTAMP
które są STABLE
:zwracają ten sam znacznik czasu w ramach tej samej transakcji. Instrukcja:
clock_timestamp()
zwraca aktualny czas, a zatem jego wartość zmienia się nawet w ramach pojedynczego polecenia SQL.
Instrukcja ostrzega, że zmienność funkcji STABLE
...
jest nieodpowiednie dla AFTER
wyzwalacze, które chcą odpytywać wiersze zmodyfikowane przez bieżące polecenie.
.. ponieważ wielokrotna ocena funkcji wyzwalacza może zwrócić różne wyniki dla tego samego wiersza. A więc nie STABLE
.
Pytasz:
Czy masz pomysł, dlaczego funkcja zwracała poprawnie pięć razy przed przyklejeniem piątej wartości, gdy jest ustawiona jako IMMUTABLE
?
Wiki Postgres:
W wersji 9.2 planista będzie korzystał z określonych planów dotyczących wysyłanych parametrów (zapytanie zostanie zaplanowane w momencie wykonania), z wyjątkiem sytuacji, gdy zapytanie jest wykonane kilka razy a planista decyduje, że plan ogólny nie jest dużo droższy niż plany szczegółowe.
Moje odważne podkreślenie. Wydaje się, że nie ma sensu dla IMMUTABLE
funkcja bez parametrów wejściowych. Ale fałszywa etykieta jest zastępowana przez VOLATILE
funkcja w ciele (unieważnia podkreślanie funkcji ):inny plan zapytań może mieć sens.Powiązane:
- Wydajność procedur zapisanych w PostgreSQL
Na bok
trunc()
jest nieco szybszy niż floor()
i robi to samo tutaj, ponieważ liczby dodatnie są gwarantowane:
SELECT (trunc(EXTRACT(EPOCH FROM clock_timestamp()) * 10) - 13885344000)::int