SELECT * FROM table ORDER BY column
Không có lý do gì để hút toàn bộ bảng vào RAM. Chỉ cần mở một con trỏ và bắt đầu đọc. Bạn có thể chơi các trò chơi với kích thước tìm nạp và không, nhưng DB sẽ vui vẻ giữ vị trí của nó trong khi bạn xử lý các hàng của mình.
Addenda:
Được rồi, nếu bạn đang sử dụng Java thì tôi biết rõ vấn đề của bạn là gì.
Đầu tiên, chỉ bằng cách sử dụng Java, bạn đang sử dụng con trỏ. Về cơ bản, đó là ResultSet trong Java. Một số Bộ Kết quả linh hoạt hơn những Bộ khác, nhưng 99% trong số đó là đơn giản, chỉ chuyển tiếp Bộ Kết quả mà bạn gọi là 'tiếp theo' để nhận từng hàng.
Bây giờ là vấn đề của bạn.
Vấn đề cụ thể là với trình điều khiển Postgres JDBC. Tôi không biết tại sao họ làm điều này, có lẽ đó là thông số kỹ thuật, có lẽ là thứ gì đó khác, nhưng bất kể, Postgres có đặc điểm gây tò mò là nếu Kết nối của bạn được đặt autoCommit thành true, thì Postgres quyết định thu thập toàn bộ kết quả trên phương thức thực thi hoặc phương thức tiếp theo đầu tiên. Không thực sự quan trọng về vị trí, chỉ là nếu bạn có một hàng gazillion, bạn sẽ nhận được một ngoại lệ OOM tốt đẹp. Không hữu ích.
Đây có thể dễ dàng là chính xác những gì bạn đang thấy và tôi đánh giá cao cách nó có thể khá bực bội và khó hiểu.
Hầu hết Kết nối mặc định thành autoCommit =true. Thay vào đó, chỉ cần đặt AutoCommit thành 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();
Lưu ý rằng việc thiếu xử lý ngoại lệ rõ ràng, còn lại như một bài tập cho người đọc.
Nếu bạn muốn kiểm soát nhiều hơn số lượng hàng được tìm nạp vào bộ nhớ tại một thời điểm, bạn có thể sử dụng:
ps.setFetchSize(numberOfRowsToFetch);
Chơi với điều đó có thể cải thiện hiệu suất của bạn.
Đảm bảo rằng bạn có một chỉ mục thích hợp trên cột mà bạn sử dụng trong ORDER BY nếu bạn quan tâm đến việc sắp xếp theo trình tự.