在与Oracle合作几年后,我刚刚转到PostgreSQL。我一直在研究PostgreSQL数据库应用程序(Java、JDBC)中准备好的语句的一些性能问题。
Oracle将准备好的语句缓存在其SGA中——准备好的声明池在数据库连接之间共享。
PostgreSQL文档似乎并没有指出这一点。以下是文档中的片段(https://www.postgresql.org/docs/current/static/sql-prepare.html)-
准备的语句只持续当前数据库的持续时间一场当会话结束时,准备好的语句被遗忘,因此在再次使用之前必须重新创建它。这也意味着一个准备好的语句不能同时被多个语句使用数据库客户端;但是,每个客户端都可以创建自己准备的语句。
我只想确保我正确理解这一点,因为数据库实现某种常用的、已准备好的语句的公共池似乎是非常基本的。
如果PostgreSQL不缓存这些,这意味着每个需要大量数据库事务的应用程序都需要开发某种准备好的语句池,这些语句池可以在连接中重复使用。
如果您以前使用过PostgreSQL,我将非常感谢您对此有任何见解。
造成这种混乱的主要原因有三个:
有一个很长的待办事项列表,当开发人员感兴趣/付费解决这些问题时,它们就会完成。据推测,还没有人认为这值得资助,也没有人想出有效的方法。
PostgreSQL在比Oracle更广泛的环境中运行。我想99%的已安装系统不会从中获得太多好处。有很多设置没有很高的事务性能要求,或者DBA没有注意到是否需要它。
有计划的查询并不总是能带来胜利。在延迟规划/使缓存无效以提供尽可能好的实际数据和查询参数方面,已经做了大量的工作。
我怀疑添加类似内容的最佳位置是在其中一个连接池(pgbouncer/pgpool)中,但上次我检查时没有这样的功能。
HTH