Kat*_*rin 5 postgresql performance plpgsql functions postgresql-performance
执行 SQL 查询的普通 SQL 函数之间是否有区别:
create function get_sports() returns setof sport as
$body$
select * from sport;
$body$
language sql stable;
Run Code Online (Sandbox Code Playgroud)
和 PLPGSQL 函数返回相同的 SQL 查询:
create function get_sports() returns setof sport as
$body$
begin
return query select * from sport;
end
$body$
language plpgsql stable;
Run Code Online (Sandbox Code Playgroud)
关于性能?在什么情况下应该使用哪个版本?
如果我们传递参数,那会改变什么吗?如:
create function get_sports(status int) returns setof sport as
$body$
select * from sport where status = $1;
$body$
language sql stable;
create function get_sports(status int) returns setof sport as
$body$
begin
return query select * from sport where status = $1;
end
$body$
language plpgsql stable;
Run Code Online (Sandbox Code Playgroud)
有各种细微的差别。
简单的 SQL 函数可以在嵌套在外部查询中时内联- 只要它们满足一些先决条件。对于 PL/pgSQL 函数是不可能的。
同一 SQL 函数中的所有语句都在调用时一次性计划,而 PL/pgSQL 函数将嵌套的 SQL DML 语句处理为很像准备好的语句 - 仅在第一次执行时计划每个语句,并可能在执行期间保存查询计划会议。这是影响行为和绩效的主要差异。
例如,您不能创建(临时)表并稍后在同一个 SQL 函数中使用它,因为它必须在调用时存在才能计划后续语句。为此,您需要 PL/pgSQL。
PL/pgSQL 函数中的代码分支未到达并因此从未计划或执行,在最终执行之前可能会隐藏未检测到的错误。PL/pgSQL 函数仅在创建时进行表面测试。
此外,SQL 函数仅返回上次查询的输出。手册:
当一个 SQL 函数被声明为 Return 时
SETOFsometype,函数的最终查询被执行到完成,它输出的每一行都作为结果集的一个元素返回。
大胆强调我的。(您可以使用UNION( ALL) 组合多个查询结果。)
RETURN QUERY,另一方面,附加到结果并且可以被多次调用。手册:
RETURN NEXT并且RETURN QUERY实际上并不从函数返回——它们只是将零或更多行附加到函数的结果集。然后继续执行 PL/pgSQL 函数中的下一条语句。随着连续RETURN NEXT或RETURN QUERY命令的执行,结果集被建立起来。finalRETURN应该没有参数,导致控制退出函数(或者你可以让控制到达函数的末尾)。
有关的:
对于任一 PL,传递参数的工作方式几乎相同。(过去在旧版本中存在更多差异,例如 SQL 函数不能引用参数名称。但那是历史。)
还有其他或多或少的细微差别。看:
| 归档时间: |
|
| 查看次数: |
1915 次 |
| 最近记录: |