【问题标题】:Execution plan cache for PL/pgSQL functions in PostgreSQLPostgreSQL 中 PL/pgSQL 函数的执行计划缓存
【发布时间】:2017-10-11 22:15:36
【问题描述】:

如果我更改另一个 PL/pgSQL 函数中正在使用的 PL/pgSQL 函数,PostgreSQL 会为这两个函数重建执行计划,还是只为更改的一个重建执行计划?

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

我以某种方式缓存了他们的执行计划。

然后我更改check_permission,是否会根据需要删除并重建get_company(user_id)get_location(user_id) 的执行计划缓存?

【问题讨论】:

  • This 不是当前问题的重复,因为一个问题是关于执行计划缓存的,另一个问题只是关于没有提及缓存的执行计划。

标签: postgresql caching sql-execution-plan


【解决方案1】:

PostgreSQL 跟踪依赖关系,并在事情发生变化时非常积极地刷新缓存。

如果你改变一个函数,它至少会使依赖它的所有函数的计划失效。实际上,IIRC 只是完全刷新所有缓存的查询计划。

依赖于其他视图的视图、引用视图的预处理语句等也是如此。

如果您发现它无法做到这一点的情况,您就发现了一个错误。请用完整的可重现测试用例报告。

【讨论】:

  • 恕我直言,视图没有缓存它们的执行计划。
  • @YevgeniyAfanasyev 不是自己,而是使用视图缓存计划的准备好的语句,包括任何内联或子计划视图
  • 函数不依赖于它们调用的函数;检查pg_depend。所以 PostgreSQL 不知道哪些函数依赖于其他函数。
  • @LaurenzAlbe 你为什么不把它作为答案发布?
  • @LaurenzAlbe,我现在该怎么办,它们都是我的问题,它们有不同的答案。我试图删除另一个没有提到缓存的,但我不能,因为这个被标记为重复。
猜你喜欢
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2015-04-30
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多