PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как ключовите думи НЕИЗМЕНЯЕМ, СТАБИЛЕН и ПРОМЕНЛИВ влияят върху поведението на функцията?

Ключовата дума IMMUTABLE еникога добавя автоматично от pgAdmin или Postgres. Който и да е създал или заменил функцията, е направил това.

Правилната волатилност за дадената функция е VOLATILE (също по подразбиране), а не STABLE - или няма да има смисъл да използвате clock_timestamp() което е VOLATILE за разлика от now() или CURRENT_TIMESTAMP които са STABLE :те връщат едно и също времеви печат в рамките на една и съща транзакция. Ръководството:

clock_timestamp() връща действителното текущо време и следователно стойността му се променя дори в рамките на една SQL команда.

Ръководството предупреждава, че волатилността на функцията STABLE ...

е неподходящ за AFTER тригери, които искат да заявят редове, модифицирани от текущата команда.

.. защото многократното оценяване на функцията за задействане може да върне различно резултати за същия ред. Така че не STABLE .

Вие питате:

Имате ли идея защо функцията се връща правилно пет пъти, преди да залепи петата стойност, когато е зададена като IMMUTABLE ?

The Postgres Wiki:

С 9.2 плановникът ще използва специфични планове по отношение на изпратените параметри (заявката ще бъде планирана при изпълнение), освен ако заявката се изпълни няколко пъти и планиращият решава, че общият план не е много по-скъп от конкретните планове.

Удебелен акцент мой. Изглежда, че няма смисъл за IMMUTABLE функция без входни параметри. Но фалшивият етикет е заменен от VOLATILE функция в тялото (загубва вградената функция ):различен план за заявка все още може да има смисъл. Свързано:

  • Ефективност на PostgreSQL съхранената процедура

Настрана

trunc() е малко по-бърз от floor() и прави същото тук, тъй като положителните числа са гарантирани:

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. Полиморфизъм в таблиците на SQL база данни?

  2. PostgreSQL, SELECT от max id

  3. Как да конкатенираме низове в PostgreSQL

  4. Нулиране на брояча за автоматично увеличение в postgres

  5. PGError:ГРЕШКА:разрешение е отказано за връзка (при използване на Heroku)