Строго кажучи, термін "збережені процедури" вказує на процедури SQL у Postgres, запроваджені разом із Postgres 11.
Є також функції , які роблять майже, але не зовсім те саме, і вони були там з самого початку.
Функції з LANGUAGE sql
- це лише пакетні файли з простими командами SQL у обгортці функцій (і, отже, атомні, завжди виконуються всередині однієї транзакції), приймаючи параметри. Усі оператори у функції SQL плануються одразу , що тонко відрізняється від виконання одного оператора за іншим і може впливати на порядок прийняття блокування.
Щодо іншого, найзрілішою мовою є PL / pgSQL ( LANGUAGE plpgsql
). Він працює добре і вдосконалювався з кожним випуском за останнє десятиліття, але найкраще служить клеєм для команд SQL. Він не призначений для важких обчислень (окрім команд SQL).
Функції PL / pgSQL виконують запити, як підготовлені оператори . Повторне використання кешованих планів запитів відрізає частину накладних витрат і робить їх трохи швидшими, ніж еквівалентні SQL-заяви, що може мати помітний ефект залежно від обставин. Також можуть виникнути побічні ефекти, як у цьому пов'язаному питанні:
Це несе в собі переваги та недоліки підготовлених тверджень - як це обговорюється в посібнику . Для запитів у таблицях з нерегулярним розподілом даних та різними параметрами динамічний SQL з EXECUTE
може бути кращим, коли виграш від оптимізованого плану виконання для заданих параметрів (ів) перевищує вартість перепланування.
Оскільки загальні плани виконання Postgres 9.2 все ще зберігаються в сесії, але, цитуючи посібник :
Це відбувається негайно для підготовлених операторів без параметрів; в іншому випадку це відбувається лише після того, як п’ять і більше виконань виробляють плани, середня орієнтовна вартість яких (включаючи накладні витрати) дорожча, ніж загальна кошторисна вартість плану.
Ми отримуємо найкращі з обох світів більшу частину часу (за винятком деяких доданих накладних витрат) без використання (ab) використання EXECUTE
. Докладніше в Що нового в PostgreSQL 9.2 у PostgreSQL Wiki .
Postgres 12 вводить додаткову змінну сервера,plan_cache_mode
щоб змусити загальні або власні плани. Для особливих випадків користуйтеся обережно.
Ви можете виграти великі функції на стороні сервера, які запобігають додатковим переїздам на сервер бази даних із вашої програми. Попросіть сервер виконати якомога більше і повернути лише чітко визначений результат.
Уникайте вкладення складних функцій, особливо функцій таблиці ( RETURNING SETOF record
або TABLE (...)
). Функції - це чорні поля, що є бар'єрами оптимізації для планувальника запитів. Вони оптимізовані окремо, не в контексті зовнішнього запиту, що робить планування більш простим, але може призвести до менш, ніж ідеальних планів. Крім того, вартість та результат результатів функцій неможливо надійно прогнозувати.
Виняток з цього правила є прості функції SQL ( LANGUAGE sql
), які можуть бути «вбудовуються» - якщо якісь - то попередні умови . Детальніше про те, як працює планувальник запитів, читайте в цій презентації Ніла Конвей (розширені матеріали).
У PostgreSQL функція завжди автоматично запускається всередині однієї транзакції . Все це вдається або нічого. Якщо відбувається виняток, все відкочується назад. Але є обробка помилок ...
Ось чому функції не є точно «збереженими процедурами» (навіть незважаючи на те, що цей термін використовується іноді, оманливо). Деякі команди типу VACUUM
, CREATE INDEX CONCURRENTLY
або CREATE DATABASE
не може працювати всередині блоку транзакції, тому вони не допускаються до функцій. (Ні в процедурах SQL, поки не в Postgres 11. Це може бути додано пізніше.)
Я написав тисячі функцій plpgsql протягом багатьох років.