PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách nhanh nhất để lấy dữ liệu tuần tự từ cơ sở dữ liệu là gì?

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ự.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. django nhận được tháng kể từ ngày tổng hợp

  2. Django với ứng dụng PostgreSQL trên Heroku không đồng bộ hóa

  3. Postgres THAM GIA TRÁI với SUM, thiếu bản ghi

  4. Làm cách nào để sử dụng kiểu nhập văn bản dưới dạng (các) tên cột trong hàm Postgres?

  5. Tạo danh sách tất cả các ngày mỗi tháng và chia đều giá trị cho mỗi ngày