java - 从数据库中检索顺序数据的最快方法是什么?

标签 java sql database postgresql sequential

我在数据库中有很多行,必须对其进行处理,但由于内存限制,我无法将所有数据检索到内存中。

目前,我使用 LIMIT 和 OFFSET 检索数据以获取某个指定时间间隔内的数据。

我想知道从数据库中的表中获取所有数据是否是更快的方法或其他方法。将不应用任何过滤器,将处理所有行。

最佳答案

SELECT * FROM table ORDER BY column

没有理由将整个表吸入 RAM。只需打开游标并开始阅读。您可以玩具有获取大小的游戏,但数据库会在您处理行时愉快地保留其位置。

附录:

好的,如果您使用的是 Java,那么我很清楚您的问题所在。

首先,仅通过使用 Java,您就在使用游标。这基本上就是 Java 中的 ResultSet。有些结果集比其他结果集更灵活,但其中 99% 的结果集很简单,仅转发您调用“下一步”以获取每一行的结果集。

现在关于你的问题。

问题特别出在 Postgres JDBC 驱动程序上。我不知道他们为什么这样做,也许是规范,也许是别的原因,但不管怎样,Postgres 有一个奇怪的特性,如果你的 Connection 将 autoCommit 设置为 true,那么 Postgres 决定在execute 方法或第一个 next 方法。至于在哪里并不重要,只是如果你有大量的行,你会得到一个很好的 OOM 异常。没有帮助。

这很容易就是您所看到的,我很欣赏它是多么令人沮丧和困惑。

大多数连接默认为 autoCommit = true。相反,只需将 autoCommit 设置为 false。

Connection con = ...get Connection...
con.setAutoCommit(false);
PreparedStatement ps = con.prepareStatement("SELECT * FROM table ORDER BY columm");
ResultSet rs = ps.executeQuery();
while(rs.next()) {
    String col1 = rs.getString(1);
    ...and away you go here...
}
rs.close();
ps.close();
con.close();

请注意明显缺乏异常处理,留给读者作为练习。

如果您想更好地控制一次将多少行提取到内存中,您可以使用:

ps.setFetchSize(numberOfRowsToFetch);

尝试一下可能会提高你的表现。

如果您关心排序,请确保在 ORDER BY 中使用的列上有适当的索引。

关于java - 从数据库中检索顺序数据的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6751690/

相关文章:

java - 如何在 JDBC 中使用 MySQL 子查询?

java - 在 Android Studio 中更改数据库路径

sql - Oracle 触发器——更新行而不是删除

database - 如何找到 DB2 (luw) 数据库的大小?

mysql - 获取数据库中最近的位置

php - 从 Joomla 3.2+ 中的另一个数据库访问数据

java - 是否曾经调用过 onUpgrade 方法?

sql - 多个连接列上的多个 STRING_AGG 导致聚合膨胀

mysql - MSSQL 将二进制日期时间导出到 MySql 日期时间

java - 由 : org. hibernate.QueryException 引起:未设置所有命名参数:[isActive] [from User where isActive = :isActive]