Tôi đang thực hiện truy vấn 'chọn' đơn giản trong vòng lặp Java như được hiển thị bên dưới. Kích thước của Danh sách có thể tăng lên đến 10000+. Làm cách nào để cải thiện tốc độ truy vấn? Bất kỳ ví dụ hoặc lời khuyên nào được đánh giá cao. Cảm ơn.Tối ưu hóa tốc độ thực hiện truy vấn "chọn" trong vòng lặp lớn
Lưu ý rằng tôi cần truy xuất tất cả dữ liệu trong mỗi cột của bảng đó, vì vậy đó là lý do tại sao dấu hoa thị (*) được sử dụng.
List<String> valueList = ....
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
conn = DriverManager.getConnection(dbURL, dbUsername, dbPassword);
for (int m = 0; m < valueList.size() ; m++) {
String sql = "SELECT * FROM WORKSHEET WHERE " + sheetId + " = '" +
valueList.get(m) + "'";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
// retreive data....
}
}
Chỉnh sửa: Cuối cùng, có một số cách để tăng tốc truy vấn này. Tôi đang sử dụng cách thứ hai vì nó ngăn chặn lỗi ORA-04031 trong tương lai.
- Sử dụng truy vấn 'SELECT' được tham số hóa với mệnh đề 'IN'.
- Tạo bảng lồng nhau và đúc mảng/danh sách các mục đến từ JDBC đến bảng được tạo lồng nhau.
- Tạo bảng tạm thời và chèn danh sách các mục. Sau đó thực hiện JOIN với bảng chính (1 truy vấn) và nhận kết quả.
[SQL Injection Hooooorrrrraaay!] (Http://bobby-tables.com/) * Sidenote: * Sử dụng truy vấn được tham số hóa cũng sẽ cung cấp cho bạn hiệu suất tốt hơn. – Bobby
Bạn đã đưa ra lý do cho * - bất kỳ lý do nào bạn không sử dụng truy vấn được tham số hóa? –
Giảm tổng số truy vấn được thực hiện bằng cách truy xuất lại nhiều cặp sheetID/m trong mỗi truy vấn ('WHERE pair1 hoặc pair2 hoặc pair3 etc ...') sẽ giảm một số chi phí. –