【问题标题】:Does PostgreSQL cache Prepared Statements like OraclePostgreSQL 是否像 Oracle 一样缓存 Prepared Statements
【发布时间】:2012-07-25 08:00:00
【问题描述】:

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

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

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

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

我只是想确保我理解这一点,因为对于数据库来说,实现某种常见的常用准备语句池似乎很基本。

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

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

【问题讨论】:

  • 您并没有真正使用(我的意思是真的)古代版本7.3中的手册供您参考,是吗?
  • 2002 年 11 月发布了 7.3 版。如今完全过时且无用。您最好使用 9.1 或 9.2 版(发布日期 2012 年 9 月)来学习 PostgreSQL,这是最新的支持生产版本。

标签: postgresql


【解决方案1】:

是的,你的理解是正确的。通常,如果您有一组非常重要的准备好的查询,那么您会让应用程序调用一个自定义函数来在连接时设置它们。

这个 afaik 有三个主要原因:

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

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

  3. 计划的查询并不总是能带来胜利。在延迟计划/使缓存失效以提供与实际数据和查询参数尽可能匹配的问题方面,已经做了大量工作。

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

HTH

【讨论】:

  • 优秀的回复。我要补充一点,尝试将 postgresql 视为 oracle 或将其视为 oracle 通常会给您带来很多麻烦。 Postgres 不是 Oracle,而且经常做不同的事情。例如,在大型内存机器上,postgresql 最适用于几 GB 的较小 shared_buffers 并让内核使用其余内存进行缓存,这与 Oracle 的做法相反。
  • 不正确,PostgresSQL JDBC 确实使用服务器端准备好的语句(使用 5 次后自动):jdbc.postgresql.org/documentation/81/server-prepare.html
  • @eckes - 我认为您没有正确阅读问题。发帖人并没有询问是否存在准备好的查询,而是询问它们是否在后端之间共享。他们不是。
猜你喜欢
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 2011-04-09
相关资源
最近更新 更多