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

Sử dụng Hibernate's ScrollableResults để đọc chậm 90 triệu bản ghi

Sử dụng setFirstResult và setMaxResults là lựa chọn duy nhất của bạn mà tôi biết.

Theo truyền thống, tập kết quả có thể cuộn sẽ chỉ chuyển các hàng cho khách hàng trên cơ sở được yêu cầu. Thật không may, MySQL Connector / J thực sự giả mạo nó, nó thực thi toàn bộ truy vấn và chuyển nó đến máy khách, vì vậy trình điều khiển thực sự có toàn bộ tập hợp kết quả được tải trong RAM và sẽ cung cấp nhỏ giọt cho bạn (bằng chứng là bạn gặp sự cố hết bộ nhớ) . Bạn đã có ý tưởng đúng, đó chỉ là thiếu sót trong trình điều khiển java MySQL.

Tôi không tìm thấy cách nào để giải quyết vấn đề này, vì vậy hãy tải các khối lớn bằng các phương thức setFirst / max thông thường. Xin lỗi vì đã mang đến những tin xấu.

Chỉ cần đảm bảo sử dụng phiên không trạng thái để không có bộ nhớ cache cấp phiên hoặc theo dõi bẩn, v.v.

CHỈNH SỬA:

CẬP NHẬT 2 của bạn là thứ tốt nhất bạn sẽ nhận được trừ khi bạn thoát ra khỏi MySQL J / Connector. Mặc dù không có lý do gì bạn không thể tăng giới hạn cho truy vấn. Miễn là bạn có đủ RAM để giữ chỉ mục, đây sẽ là một hoạt động hơi rẻ. Tôi sẽ sửa đổi nó một chút và lấy một lô tại một thời điểm và sử dụng id cao nhất của lô đó để lấy lô tiếp theo.

Lưu ý:điều này sẽ chỉ hoạt động nếu điều_kiện khác sử dụng bình đẳng (không cho phép điều kiện phạm vi) và có cột cuối cùng của chỉ mục là id .

select * 
from person 
where id > <max_id_of_last_batch> and <other_conditions> 
order by id asc  
limit <batch_size>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách đánh giá hiệu suất của Moodle

  2. Ngăn gia tăng tự động InnoDB TRÊN KHÓA DUPLICATE

  3. Làm cách nào để tạo id duy nhất trong MySQL?

  4. Lỗi mysql 1025 (HY000):Lỗi khi đổi tên của './foo' (errorno:150) nghĩa là gì?

  5. Kết nối với mysql trên Amazon EC2 từ máy chủ từ xa