PostgreSQL函数执行计划缓存原理

PostgreSQL function execution plan cache principle

假设我有 2 个函数使用第三个函数。假设函数 check_permission(user_id) 被 get_company(user_id) 和 get_location(user_id).

使用

执行计划缓存如何工作?我的意思是它会为 check_permission 和 get_company 函数制定单独的执行计划,还是会为 get_company 制定一个计划?如果单独为 get_company 和 get_location 构建执行计划,即使它们都使用 check_permission 函数,执行计划也有可能更有效。

"It depends".

它可以做到其中之一或两者。

如果check_permission是满足内联要求的LANGUAGE sql函数,get_companyand/orget_location也是LANGUAGE sql或者将它用作重要查询的一部分,它可能会被内联和计划两次,一次针对每个调用者,作为调用查询的一部分。

否则,通常会在任一呼叫者首次呼叫时计划一次。

顺便说一句,在可行的情况下考虑使用视图而不是函数。它们效率更高,并为计划者提供了更多选择。但是,如果他们需要 SECURITY_BARRIER 视图来防止信息泄露,那么好处就更少了。

我想知道您是否犯了一个真正的错误,即专注于计划时间而没有(就您所展示的)调查有多少计划时间实际影响了您的表现。而且您似乎没有考虑通过 fmgr 和 plpgsql 过程处理程序等进行工作的 显着 开销,与原始查询相比,并将其与计划成本进行权衡。我强烈建议您至少在确保在整个应用程序中以最佳方式使用准备好的语句之前不要继续这样做。然后 衡量 相对成本,你的工作量