Мені незрозуміло справжнє значення у визначеннях функцій IMMUTABLE, VOLATILE та STABLE.
Я читав документацію, конкретно визначення кожної.
IMMUTABLE вказує на те, що функція не може змінювати базу даних і завжди повертає той самий результат, коли даються однакові значення аргументу ; тобто він не здійснює пошук баз даних або іншим чином використовує інформацію, яка безпосередньо не присутня в його списку аргументів. Якщо ця опція задана, будь-який виклик функції з незмінними аргументами можна негайно замінити значенням функції.
STABLE вказує на те, що функція не може змінювати базу даних, і що в межах однієї сканування таблиці вона послідовно повертає той самий результат для одних і тих же значень аргументу , але що його результат може змінюватися в операторах SQL. Це відповідний вибір для функцій, результати яких залежать від пошуку в базі даних, змінних параметрів (таких як поточний часовий пояс) тощо (недоцільно для ПІСЛЯ тригерів, які бажають запитувати рядки, змінені поточною командою.) Також зауважте, що Сімейство функцій current_timestamp кваліфікується як стабільне, оскільки їх значення не змінюються в межах транзакції.
VOLATILE вказує на те, що значення функції може змінюватися навіть у межах одного сканування таблиці, тому оптимізації не можна проводити. Відносно мало функцій бази даних є мінливими в цьому сенсі; деякі приклади - випадкові (), currval (), timeofday (). Але зауважте, що будь-яку функцію, яка має побічні ефекти, слід класифікувати нестабільною, навіть якщо її результат є досить передбачуваним, щоб запобігти оптимізації викликів; приклад - setval ().
Моя плутанина виникає з умовою для НЕМАТИЧНОГО та СТАБІЛЬНОГО, що функція ЗАВЖДИ чи ПОСЛІДНО повертає той самий результат, даючи ті самі аргументи.
Визначення IMMUTABLE зазначає, що функція не здійснює пошуку в базі даних або іншим чином використовує інформацію, яка безпосередньо не присутня в її списку аргументів. Отже, для мене це означає, що такі функції використовуються для маніпулювання даними, що надаються клієнтом, і не повинні мати операторів SELECT ... хоча це просто звучить для мене трохи дивно.
Щодо STABLE, визначення є аналогічним тим, що воно говорить, що воно повинно послідовно повертати той самий результат. Отже, для мене це означає, що кожен раз, коли функція викликається одними і тими ж аргументами, вона повинна повертати однакові результати (однакові точні рядки, кожен раз).
Отже, для мене ... це означає, що будь-яка функція, яка виконує SELECT на таблиці або таблицях, які можна оновити, повинна бути лише мінливою.
Але, знову ж таки ... це не здається мені правильним.
Повертаючи це до свого використання, я записую функції, які виконують оператори SELECT з кількома JOIN на таблицях, до яких постійно додаються, тому очікується, що виклики функцій будуть повертати різні результати кожного разу, коли вона викликається, навіть при однакових аргументах .
Отже, чи означає це, що мої функції повинні бути ВОЛОТИЛЬНИМ? Навіть незважаючи на те, що документація вказує на відносно мало функцій бази даних в цьому сенсі є мінливими ?
Дякую!