PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak słowa kluczowe IMMUTABLE, STABLE i VOLATILE wpływają na zachowanie funkcji?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobierz nazwę dnia z daty w PostgreSQL

  2. Dlaczego Postgres nie korzysta z indeksu?

  3. Używanie logicznej replikacji PostgreSQL do utrzymywania zawsze aktualnego serwera TEST do odczytu/zapisu

  4. Jak utworzyć widok SQL za pomocą SQLAlchemy?

  5. Nowe dane nie są zachowywane w kolumnie tablicy Rails w Postgresie