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

Ren*_*ani 0 java sql database postgresql sequential

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

目前,我使用LIMIT和OFFSET检索数据,以获得一些especified间隔的数据.

我想知道这是更快的方式还是有另一种方法从数据库中的表中获取所有数据.将不应用任何过滤器,将处理所有行.

Wil*_*ung 5

SELECT * FROM table ORDER BY column
Run Code Online (Sandbox Code Playgroud)

没有理由将整个表格吸入RAM.只需打开光标即可开始阅读.你可以玩带有提取大小的游戏,但是你可以在处理行时愉快地保留它的位置.

附加物:

好的,如果您使用的是Java,那么我很清楚您的问题是什么.

首先,只需使用Java,就可以使用游标了.这基本上是Java中的ResultSet.一些ResultSet比其他ResultSet更灵活,但其中99%是简单的,只转发结果集,你可以在下一行调用每一行.

现在你的问题.

问题特别在于Postgres JDBC驱动程序.我不知道为什么他们这样做,也许是规格,也许是别的,但无论如何,Postgres有一个奇怪的特征,即如果你的Connection有autoCommit设置为true,那么Postgres决定在整个结果集上吸吮执行方法或第一个下一个方法.对于哪里来说并不重要,只有当你拥有大量的行时,才能获得一个不错的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();
Run Code Online (Sandbox Code Playgroud)

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

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

ps.setFetchSize(numberOfRowsToFetch);
Run Code Online (Sandbox Code Playgroud)

玩弄它可能会提高你的表现.

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