特设SQL与函数的PostgreSQL性能

特设SQL与函数的PostgreSQL性能,postgresql,prepared-statement,plpgsql,sql-execution-plan,Postgresql,Prepared Statement,Plpgsql,Sql Execution Plan,有什么区别吗?我知道SQL查询的执行计划缓存得和函数一样好 我告诉你: 性能是一个问题,我们怀疑查询规划可能是一个问题 根本原因。我已经将脚本从即席SQL重写为 Postgres函数(创建函数),我们看到服务器负载下降 相当多 但是为什么呢?临时查询的查询计划不会被缓存,而只是用于。PL/pgSQL函数在内部处理所有SQL语句,就像预处理语句一样。(除了带有EXECUTE的动态SQL之外)每个都适用于当前会话的范围,而不是超出范围 因此PL/pgSQL函数(不是SQL函数!)可以帮助在同一会话中

有什么区别吗?我知道SQL查询的执行计划缓存得和函数一样好

我告诉你:

性能是一个问题,我们怀疑查询规划可能是一个问题 根本原因。我已经将脚本从即席SQL重写为 Postgres函数(创建函数),我们看到服务器负载下降 相当多


但是为什么呢?

临时查询的查询计划不会被缓存,而只是用于。PL/pgSQL函数在内部处理所有SQL语句,就像预处理语句一样。(除了带有
EXECUTE
的动态SQL之外)每个都适用于当前会话的范围,而不是超出范围

因此PL/pgSQL函数(不是SQL函数!)可以帮助在同一会话中重复执行复杂的查询。就像事先准备好的声明一样

默认情况下,客户端软件可能使用准备好的语句。或者说,同样的效果

相关的:

您所指的相关答案如下:


还考虑手册中的PL/PGSQL的章节。

我被告知查询使他们的执行计划被缓存。不缓存特殊SQL语句的查询计划。只为准备好的声明。对。我假设您使用的是预先准备好的语句,因为如果您甚至考虑计划如何缓存在函数中等细节,那么您就已经这样做了,作为降低计划成本的第一步。另外,如果被调用的函数是一个可内联SQL函数,那么它可能会在调用plpgsql函数时被间接缓存。顺便说一句,我认为你把重点放在计划时间上,而没有(如你所示)研究计划时间对性能的实际影响,这是一个真正的错误。您似乎没有考虑通过fmgr和plpgsql proc处理程序等执行工作与原始查询之间的巨大开销,并将其与规划成本进行权衡。我强烈建议您在确保在整个应用程序中以最佳方式使用准备好的语句之前,不要再继续这样做。