在与甲骨文合作几年后,我刚搬到PostgreSQL。我一直在研究PostgreSQL数据库应用程序(Java、JDBC)中准备语句的一些性能问题。
Oracle在其SGA中缓存准备好的语句-准备好的语句池在数据库连接之间共享。
PostgreSQL文档似乎没有指出这一点。以下是文档中的片段(https://www.postgresql.org/docs/current/static/sql-prepare.html) -
准备好的语句仅在当前数据库会话期间有效。会话结束时,已准备好的语句将被遗忘,因此在再次使用之前必须重新创建该语句。这也意味着一个准备好的语句不能被多个同时的数据库客户端使用;但是,每个客户机都可以创建自己准备好的语句以供使用。
我只想确保我正确地理解了这一点,因为对于数据库来说,实现某种常见执行准备语句的公共池似乎是非常基本的。
如果PostgreSQL不缓存这些,这意味着每个需要大量数据库事务的应用程序都需要开发某种类型的预处理语句池,以便在连接之间重复使用。
如果您以前使用过PostgreSQL,我将非常感谢您能深入了解这一点。
是的,你的理解是正确的。通常情况下,如果你有一组准备好的查询,那么你会让应用程序调用一个自定义函数来在连接时设置它们。
有三个关键的原因,这afaik:
>
PostgreSQL在比Oracle更广泛的环境中运行。我猜99%的已安装系统不会从中受益。有很多设置没有高事务性能要求,或者DBA需要注意是否需要。
计划好的查询并不总能带来成功。在延迟规划/使缓存失效以尽可能好地拟合实际数据和查询参数方面已经做了大量工作。
我想最好的地方是在一个连接池(pgbouncer/pgpool)中添加类似的东西,但上次我检查时,没有这样的功能。
嗯
我一直在读一些较新的JDBC连接池(如Tomcat)不支持客户端语句池。我已经读到,这是因为大多数JDBC驱动程序都维护自己的语句缓存。然而,我不认为PostgreSQL会发生这种情况。 我说的对吗?如果是这样,我应该使用一个连接池来缓存准备好的语句,以获得最佳的批插入性能吗? 谢谢
我读到MySQL不支持服务器端查询计划缓存。所以如果我想使用PreparedStatements来获得性能优势,我能做的就是在JDBC连接中启用语句缓存。因此,根据文档,它将允许缓存每个连接基础上准备好的语句。 与如果MySQL有服务器端查询计划缓存相比,JDBC连接的PreparedStatement缓存的性能增益是什么?因此,如果PreparedStatement确实在物理连接的缓存中找到,这
我正在为我的sqlite日志数据库使用准备好的语句。 我的线程每50ms运行一次,将日志缓冲区中的内容写入数据库。 目前,我正在对每个线程运行一个新的准备好的语句批处理,并在所有数据线写入后关闭它们。 现在我想知道是否最好将准备好的语句保存在内存中,并仅在线程关闭/中断时关闭它? 我之所以进行这种预优化,是因为我希望这个日志线程对主应用程序性能的干扰尽可能小,我可以想象每50秒分配/解析/验证资源
问题内容: Factory Girl是Rails中的一个方便框架,可轻松创建模型实例进行测试。 在Factory Girl主页上: factory_girl允许您快速定义每个模型的原型,并请求具有对于手头测试很重要的属性的实例。 一个示例(也来自主页): 如果我需要用户,可以致电 这将使用户拥有工厂原型中指定的所有属性, 但 我明确指定的admin属性 除外 。还要注意,电子邮件工厂方法每次调用都
问题内容: 我之前在一个PHP项目中工作过,其中准备好的语句使SELECT查询的速度提高了20%。 我想知道它是否适用于Python?我似乎找不到任何明确表明可以或不能做到的事情。 问题答案: 直接回答,不,不是。 joshperry的答案很好地解释了它的作用。 从eugene y答案到类似问题, 检查MySQLdb 包注释: 在MySQLdb中,通过转义字符串然后将其盲目插入到查询中来进行“参数
我相信我已经在Cassandra csharp驱动程序(版本2.7.3)的StatementFactory中发现了一个关于如何缓存准备好的语句的逻辑的bug。下面是使用案例。 我们发现,运行此删除后,只有第一个请求成功。在深入了解StatementFactory的源代码之后 您可以看到缓存仅使用 cql 语句。在我们的例子中,我们在不同的键空间(又名会话)中具有相同的表名。两个查询中的 cql 语