tangguo

PostgreSQL查询上的大型ResultSet

java

我正在对PostgreSQL数据库中的表运行查询。该数据库位于远程计算机上。该表具有约30个使用postgresql分区功能的子表。

该查询将返回一个很大的结果集,大约有180万行。

在我的代码中,我使用spring jdbc支持,即方法JdbcTemplate.query,但未调用我的RowCallbackHandler。

我最好的猜测是postgresql jdbc驱动程序(我使用版本8.3-603.jdbc4)在调用代码之前在内存中累积了结果。我以为fetchSize配置可以控制它,但是我尝试了一下,没有任何变化。我这样做是因为建议postgresql手册。

当我使用Oracle XE时,此查询工作正常。但是由于分区功能(Oracle XE中不提供该功能),我试图迁移到postgresql。

我的环境:

  • PostgreSQL 8.3
  • Windows Server 2008企业版64位
  • JRE 1.6 64位
  • spring 2.5.6
  • PostgreSQL JDBC驱动程序8.3-603

阅读 278

收藏
2020-10-22

共1个答案

小编典典

为了使用游标检索数据,除了设置获取大小外,还必须设置ResultSet类型的ResultSet.TYPE_FORWARD_ONLY(默认值),并自动提交为false。您链接到的文档中提到了这一点,但是您没有明确提及您执行了这些步骤。

注意PostgreSQL的分区方案。它确实会对优化器造成非常可怕的影响,并可能导致本应避免的大量性能问题(取决于数据的具体情况)。无论如何,您的行只有180万行吗?只要有适当的索引,就没有理由仅根据大小对其进行分区。

2020-10-22