【发布时间】:2018-07-20 18:34:28
【问题描述】:
我已经查看了类似的问题 See and clear Postgres caches/buffers? ,但所有答案都集中在数据缓冲区上,自 2010 年以来 Postgresql 发生了很大变化。
与那个问题的 OP 不同,我不是在计算性能时寻找一致的行为,而是在数据库随时间变化时寻找自适应行为。
在我的应用程序中,在作业执行开始时,工作表中的行是空的。查询运行得非常快,但随着时间的推移,性能会下降,因为准备好的语句没有使用理想的访问路径(它们是在表为空时准备好的——doh!)。由于作业的典型执行最终将覆盖几亿行,因此我需要最大限度地减少所有开销并定期运行统计数据以获得最佳访问路径。
在SQLServer中,可以定期调用update statistics和DBCC FreeProccache,准备好的语句会自动重新准备使用新的访问路径。
编辑:FreeProcCache:在 SQLServer 中,准备好的语句被实现为存储过程。 FreeProcCache 会擦除已编译的存储过程,以便在下次调用时重新编译它们,并且新的访问路径会立即生效。
编辑:postgresql 对prepared statements 管理的详细信息:Postgresql 将prepare 推迟到第一次调用EXECUTE,并在第5 次执行后缓存prepare 的结果。缓存后,计划将被固定,直到会话结束或使用DEALLOCATE 释放准备好的语句。关闭 JDBC 对象不会调用 DEALLOCATE,作为支持打开/读取/关闭编程的优化,就像许多 Web 应用程序显示一样。
有没有办法在运行ANALYZE 之后强制(编辑)JDBC 准备好的语句重新编译,(编辑),所以它将使用最新的统计信息?
编辑:我正在使用 JDBC PreparedStatement 来准备和执行对数据库和 Postgres JDBC 驱动程序的查询。
【问题讨论】:
标签: database postgresql performance jdbc prepared-statement