PostgreSQL函数执行计划缓存原则

时间:2017-10-10 23:33:36

标签: postgresql sql-execution-plan

假设我使用第三个函数有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函数,执行计划也有可能更有效。

1 个答案:

答案 0 :(得分:0)

"这取决于"。

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

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

否则,一旦被调用者首次调用,它通常会被计划一次。

顺便说一句,考虑在实际使用视图而不是函数。他们提高效率并为计划者提供更多选择。但如果他们需要SECURITY_BARRIER次观看以防止信息泄露,那么效益就会降低。

我想知道你是否可能犯了一个真正的错误,重点是在没有(据你所示)的情况下计划时间,看看实际影响你的表现有多少计划时间。而且您似乎没有考虑通过fmgr和plpgsql过程处理程序等进行工作的重要开销,与原始查询相比,并根据计划成本进行权衡。我强烈建议您不要进一步追求这一点,直到您确保在整个应用程序中最佳地使用准备好的语句,至少。然后衡量相对成本,您的工作量