【发布时间】: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