Gis*_*nas 21 postgresql stored-procedures plpgsql
任何人都可以总结以下之间的区别:
http://www.postgresql.org/docs/9.1/static/xfunc-sql.html
和
http://www.postgresql.org/docs/9.1/static/plpgsql.html
?
要点:
Cra*_*ger 30
PL/PgSQL 和普通 SQL 函数都是更大工具集的一部分,应该在该上下文中查看。我倾向于从与复杂性和成本上升相匹配的能力的上升规模来考虑它,您应该使用最简单的工具来完成这项工作:
LISTEN
与NOTIFY
它交谈。通常,当您认为需要某个功能时,一个视图就足够了。即使它对SELECT
整个视图来说非常昂贵,WHERE
查询中引用视图的子句通常会下推到视图中,并可能导致非常不同的查询计划。通过将 SQL 函数转换为视图,我经常获得很大的性能改进。
您发现无法使用视图而应该考虑使用 SQL 函数的主要时间是:
WHERE
子句的参数,例如WITH
表达式中的参数SECURITY DEFINER
函数设置安全屏障,而security_barrier
PostgreSQL 9.2 及更高版本中的视图不足以满足您的需求;对于大多数这些任务,一个普通的 SQL 函数可以正常工作,并且通常比 PL/PgSQL 更容易阅读。SQL 函数声明STABLE
or IMMUTABLE
(并且未声明STRICT
or SECURITY DEFINER
)也可以内联到调用语句中。当调用函数中的 WHERE 条件被优化器推送到 SQL 函数时,这消除了函数调用开销,有时还会带来巨大的性能优势。只要 SQL 函数足以完成任务,就使用它们。
SQL 函数无法完成这项工作的主要时间是当您需要大量逻辑时。If/then/else 操作无法表达为CASE
语句、大量重复使用计算结果、从块中构建值、错误处理等。然后 PL/PgSQL 就派上用场了。当您不能使用 SQL 函数或它们不适合时,请选择 PL/PgSQL,例如:
EXECUTE
语句RAISE
为日志或客户端显示错误/警告时EXCEPTION
块捕获和处理错误,而不是让整个事务因错误而终止CASE ... WHEN
非常好WITH
和 CTE对于通用表表达式 (CTE),尤其是可写 CTE,WITH RECURSIVE
我发现我使用 PL/PgSQL 的次数比以前少了很多,因为 SQL 的表现力和功能要强得多。我现在更多地使用视图和普通 SQL 函数。值得记住的是,普通的 SQL 函数可以包含多个语句;最后一条语句是函数的结果。
plpgsql
是一种成熟的过程语言,具有变量、循环结构等。SQL
函数只是一个子查询。SQL 函数,如果已声明STABLE
或未IMMUTABLE
声明STRICT
,通常可以内联到调用查询中,就像在每个引用上写出一样。
归档时间: |
|
查看次数: |
8016 次 |
最近记录: |