8

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

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

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

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

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

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

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

4

1 回答 1

8

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

这个 afaik 有三个主要原因:

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

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

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

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

高温高压

于 2012-07-26T18:18:57.773 回答