在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)中,但是上次我没有找到这样的功能。
高温超导
| 归档时间: |
|
| 查看次数: |
4188 次 |
| 最近记录: |