【问题标题】:Get All Rows From a Postgres Table从 Postgres 表中获取所有行
【发布时间】:2017-03-01 11:06:42
【问题描述】:

我们在 Postgres DB 中有一个表,其中列出了两个整数,比如 i1、i2 和一个双精度数,比如 d。

出于某种原因,我们需要此表中所有行中这些字段的所有值。另外,我们需要使用 Java 来做这件事,不要问我为什么。

我正在尝试寻找最有效的方法。当然,我可以通过查询执行 Java 语句

SELECT i1, i2, d FROM mytable;

然后遍历 ResultSet。我担心这可能会给数据库带来负担。

表格可能包含几百万行(绝对小于 10m),我们只对这三个字段感兴趣。

如果有一个单列主键,我可以很容易地写一个游标调用,像这样

SELECT i1, i2, d FROM mytable where primarykey > ?; 

但该表没有单列主键。

虽然 i1 和 i2 保证是唯一的,但表没有索引,并且鉴于这只是一次性活动,团队中的任何人都不太可能有兴趣创建一个。

如果没有索引,我怀疑选择所有行实际上会比按 i1 和 i2 排序然后使用它们编写游标调用便宜。

最有效且问题最少的方法是什么?

【问题讨论】:

  • 您显示的 select 语句是唯一的方法。但是,您可能希望将驱动程序配置为使用游标获取结果:jdbc.postgresql.org/documentation/head/…
  • 您可以通过在这 3 个字段上创建索引来“准备”数据 - 这样 select 将只扫描索引,但只有在您经常只扫描这 3 列并且额外的索引是负担得起的情况下才有意义
  • 嗨,没有单列主键,虽然 i1 和 i2 保证是唯一的,但没有索引。用这个描述更新了帖子。很抱歉在写原始描述时忘记了这一点。
  • 你试过(i1, i2) > (?, ?)吗?正如 a horse 所说:您也可以使用游标获取(我相信 PostgreSQL 默认会获取所有内容)。
  • 嗨,马克,这是可能的,但没有索引可能比盲选更昂贵。

标签: sql postgresql jdbc


【解决方案1】:

只需运行选择即可获取所有行。 Postgres 完全可以处理。

省略任何order by 以降低处理成本。

您应该担心的唯一问题是驱动程序的内存消耗。默认情况下,Postgres 驱动程序在从 executeQuery() 调用返回之前缓冲内存中的 all 行。

您可能需要将驱动程序配置为不这样做。这在驱动程序手册中有介绍:

https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor

【讨论】:

  • 快速跟进问题 - 这是否适用于 PreparedStatement?即这会限制 PreparedStatement 查询的获取大小吗?
  • @D159 它也可以与 PreparedStatement 一起使用(如果不这样做就没有多大意义)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
相关资源
最近更新 更多