簡體   English   中英

從數據庫中檢索順序數據的最快方法是什么?

[英]What is the fastest way to retrieve sequential data from database?

我在數據庫中有很多行,必須對其進行處理,但由於 memory 的限制,我無法將所有數據檢索到 memory。

目前,我使用 LIMIT 和 OFFSET 來檢索數據以在某個指定的時間間隔內獲取數據。

我想知道這是更快的方法還是有另一種方法來從數據庫中的表中獲取所有數據。 將不應用任何過濾器,將處理所有行。

SELECT * FROM table ORDER BY column

沒有理由將整個表吸入 RAM。 只需打開 cursor 並開始閱讀。 您可以玩具有 fetch 大小的游戲等等,但是當您處理行時,DB 會很高興地保留它的位置。

附加物:

好的,如果您使用的是 Java,那么我很清楚您的問題是什么。

首先,只需使用 Java,您就可以使用 cursor。 這基本上就是 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();

請注意明顯缺乏異常處理,留給讀者練習。

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

ps.setFetchSize(numberOfRowsToFetch);

玩弄它可能會提高你的表現。

如果您完全關心排序,請確保您在 ORDER BY 中使用的列上有適當的索引。

既然它根據您的評論清除了您使用 Java :

If you are using JDBC you will want to use: http://download.oracle.com/javase/1.5.0/docs/api/java/sql/ResultSet.html

If you are using Hibernate it gets trickier: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM