2017-04-18 37 views
0

我正在对很多查询运行一些基准测试。我有一系列的查询,它们会在彼此之后多次运行。我知道PostgreSQL缓存查询计划,所以这是重要的考虑,但据我所知,这并不总是发生。PostgreSQL在相同的查询上接近计划缓存?

所以我有两种方法。我正在考虑(a)强制每次运行查询时生成查询计划,或者(b)稍微“预热”一下,以便计划被缓存并且每次重用。我该如何执行,或者我可以采取哪些预防措施来确保其中一个发生?

如果我可以监控缓存中的计划,但是我不确定是否有可能,那将会很棒。

更新:我的查询是复杂的SELECTs来检索数据,没有DELETEs/INSERTs等。这是否意味着我不应该对查询计划器在基准测试中给予如此的尊重?如果

  • 你使用准备好的语句
  • 的语句是PL/pgSQL功能

所以内执行的,如果你想基准你的查询如何更快成为如果

回答

1

PostgreSQL只缓存查询计划您避免了计划的开销,您应该创建一个准备好的语句并至少执行六次(因为前五次运行将始终生成自定义计划)。

如果您的查询很复杂,那么如果您缓存查询计划,尤其是在查询运行时间很长时,甚至可能会丢失您的查询。在这种情况下,通常花更多的精力来规划每个查询。准备好的语句最大的胜利是查询执行时间较少。

+0

谢谢!您建议通过准备好的报表进行基准测试,而不需要计划开销你也可以说PostgreSQL也通过PL/pgSQL函数来缓存查询计划 - 这意味着我可以期待相同的行为,即如果我使用PL/pgSQL过程并执行它至少5次,那么我可以安全地期望缓存计划第六轮开始? – Zeruno

+0

是的,你说得对 - 在大多数情况下。有时PostgreSQL会认为通用计划不够好,并继续生成自定义计划。为了测试,你可以在函数内部使用'EXPLAIN EXECUTE prepared_statement'或auto_explain来声明。如果您在那里看到“$ 1”,则使用通用计划。没有参数的陈述当然总是使用通用计划。 –

+0

感谢您解释良好的答复!很有帮助。 – Zeruno