谁能总结一下以下两者之间的区别:
http://www.postgresql.org/docs/9.1/static/xfunc-sql.html
和
http://www.postgresql.org/docs/9.1/static/plpgsql.html
?
要点:
- 概念差异
- 给有问题的家庭,使用方便
- 政治问题
谁能总结一下以下两者之间的区别:
http://www.postgresql.org/docs/9.1/static/xfunc-sql.html
和
http://www.postgresql.org/docs/9.1/static/plpgsql.html
?
要点:
Answers:
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就派上用场了。当您无法使用SQL函数或它们不合适时,请选择PL / PgSQL,例如:
EXECUTE
语句执行动态SQL和动态DDLRAISE
日志或客户端进行错误/警告时EXCEPTION
块捕获和处理错误,而不是使整个事务因错误而终止CASE ... WHEN
非常好WITH
和CTE使用通用表表达式(CTE),尤其是可写CTE,WITH RECURSIVE
我发现我使用PL / PgSQL的次数比以前少了很多,因为SQL更具表现力和功能。我现在更多地使用视图和普通的SQL函数。值得记住的是,普通的SQL函数可以包含多个语句。最后一条语句是函数的结果。