PostgreSQL是否像Oracle一样缓存准备好的语句

时间:2012-07-26 16:57:19

标签: postgresql

在与Oracle合作几年后,我刚刚搬到PostgreSQL。 我一直在研究使用PostgreSQL数据库在应用程序(Java,JDBC)中准备好语句的一些性能问题。

Oracle在其SGA中缓存预准备语句 - 预准备语句池在数据库连接之间共享。

PostgreSQL文档似乎没有表明这一点。这是文档(https://www.postgresql.org/docs/current/static/sql-prepare.html) -

中的代码段
  

预准备语句仅持续当前数据库的持续时间   会话。会话结束时,忘记准备好的声明,   所以必须在重新使用之前重新创建它。这也意味着   单个预准备语句不能同时使用多个   数据库客户;但是,每个客户都可以创建自己的准备   声明使用。

我只是想确保我理解这一点,因为对于数据库来说,实现某种常用的预处理语句的公共池似乎是如此基础。

如果PostgreSQL没有缓存这些意味着每个需要大量数据库事务的应用程序需要开发某种可以跨连接重用的预准备语句池。

如果您以前曾使用过PostgreSQL,我将不胜感激。

1 个答案:

答案 0 :(得分:5)

是的,您的理解是正确的。通常情况下,如果您有一组准备好的查询,那么您可以让应用程序调用自定义函数来设置连接。

这个afaik有三个主要原因:

  1. 有一个很长的待办事项列表,当开发人员感兴趣/付费处理它们时,它们就会完成。据推测,没有人认为它值得资助或想出一种有效的方法。

  2. PostgreSQL在比Oracle更广泛的环境中运行。我猜想99%的安装系统都不会从中看到太多的好处。有很多设置没有高事务性能要求,或者DBA需要注意是否需要它。

  3. 计划的查询并不总能提供胜利。在推迟规划/使缓存无效方面做了大量工作,以尽可能地提供实际数据和查询参数。

  4. 我怀疑添加类似这样的东西的最佳位置是在其中一个连接池(pgbouncer / pgpool)中,但是上次我检查过这样的功能时没有。

    HTH

相关问题