Кто-нибудь может, пожалуйста, суммировать различия между:
http://www.postgresql.org/docs/9.1/static/xfunc-sql.html
и
http://www.postgresql.org/docs/9.1/static/plpgsql.html
?
Основные положения:
- концептуальные различия
- учитывая проблемную семью, удобство использования
- политические вопросы
postgresql
stored-procedures
plpgsql
Джисмо Ранас
источник
источник
Ответы:
Функции PL / PgSQL и обычный SQL являются частью большего набора инструментов и должны рассматриваться в этом контексте. Я склонен думать об этом с точки зрения возрастающей шкалы мощности в сочетании с возрастающей сложностью и стоимостью, где вы должны использовать самый простой инструмент, который хорошо справится с работой:
LISTEN
иNOTIFY
поговорить с ней.Очень часто представление достаточно, когда вы думаете, что нужна функция. Даже если это очень дорого для
SELECT
всего представления,WHERE
предложения в запросе, ссылающиеся на представление, обычно выталкиваются вниз в представление и могут привести к очень разным планам запросов. У меня часто были большие улучшения производительности от преобразования функций SQL в представления.Основное время, когда вы обнаружите, что не можете использовать представление и должны рассмотреть функцию SQL, это когда:
WHERE
предложений, например, параметр вWITH
выраженииSECURITY DEFINER
функцию, иsecurity_barrier
представления в PostgreSQL 9.2 и выше не подходят для ваших нужд;Для большинства из этих задач простая функция SQL работает нормально, и ее часто легче читать, чем PL / PgSQL. Функции SQL, объявленные
STABLE
илиIMMUTABLE
(и не объявленныеSTRICT
илиSECURITY DEFINER
), также могут быть встроены в вызывающий оператор. Это избавляет от накладных расходов, связанных с вызовом функции, и иногда может привести к огромным выигрышам в производительности, когда условие WHERE в вызывающей функции помещается оптимизатором в функцию SQL. Используйте функции SQL всякий раз, когда они достаточны для задачи.Основное время, когда функции SQL не справляются с этой задачей, - это когда вам нужно много логики. Если / то / еще операции, которые вы не можете выразить как
CASE
операторы, многократное использование вычисленных результатов, построение значений на основе кусков, обработка ошибок и т. Д. PL / PgSQL пригодится тогда. Выбирайте PL / PgSQL, когда вы не можете использовать функции SQL или они плохо подходят, например, для:EXECUTE
операторRAISE
ошибки / предупреждения для журналов или клиентаEXCEPTION
блоками, вместо того, чтобы вся транзакция завершалась при ошибкеCASE ... WHEN
очень хорошо подходитWITH
CTE иС общими табличными выражениями (CTE), особенно написанными CTE, и
WITH RECURSIVE
я обнаружил, что я использую PL / PgSQL гораздо меньше, чем раньше, потому что SQL намного более выразителен и мощен. Сейчас я использую представления и простые функции SQL гораздо чаще. Стоит помнить, что простые функции SQL могут содержать более одного оператора; последнее утверждение является результатом функции.источник
plpgsql
является полноценным процедурным языком с переменными, циклическими конструкциями и т. д.SQL
Функция - это просто подзапрос. Функция SQL, если она объявленаSTABLE
илиIMMUTABLE
не объявленаSTRICT
, часто может быть встроена в вызывающий запрос, как если бы она была записана в каждой ссылке.источник