Tôi có một kịch bản trong đó tôi phải xóa hàng trăm nghìn hàng định kỳ (dựa trên quyết định của máy chủ hoặc một khoảng thời gian cố định). Tôi đang sử dụng entityframework 6.0 và vấn đề là bình thường Remove() phương pháp là chậm cho hoạt động số lượng lớn. Tôi đang nghĩ đến một số trường hợp có thể:Chọn cách tối ưu để xóa các hàng trong oracle mặc dù khung thực thể
Trường hợp 1: Thông qua khung pháp nhân, hãy sử dụng RemoveRange.
var db = new MyDbContext();
var itemsToDelete = db.TableFoo.Where(x=>!x.new);
db.MyTable.RemoveRange(itemsToDelete);
db.SaveChanges();
Tôi đã kiểm tra điều này và điều này nhanh hơn việc sử dụng Xóa một mình trong foreach. Nhưng nó vẫn gửi sql nguyên tử oracle thay vì hàng loạt.
Trường hợp 2: Thông qua khung thực thể, gọi một số thủ tục hoặc gói mà ngược lại sẽ thực hiện thao tác xóa trên bảng. Mặc dù có vẻ như tôi là lựa chọn nhanh nhất, nhưng tôi vẫn phải tìm ra đây là cách tốt nhất để xóa, tôi biết cắt ngắn, nhưng nó sẽ không phục vụ mục đích ở đây. Những gì tôi biết là:
CREATE OR REPLACE PROCEDURE deleteDBFoo(p_toc IN DBFOO.TOC%TYPE)
IS
BEGIN
DELETE DBFOO where TOC < "SOME DATE";
COMMIT;
END;
Trường hợp 3: Để tự động hiện nhiệm vụ này trong oracle (không biết nếu điều này có thể hoặc ý tưởng tốt) tiêu chí trong trường hợp là để xóa tất cả các hàng cũ từ một số ngày sửa chữa -Khoảng thời gian.
Cách tối ưu hóa để xử lý trường hợp này là gì? Nếu có một số cách tốt hơn khác hơn những trường hợp này, vui lòng làm sáng tỏ điều này.
UPDATE1: Sau khi thực hiện một số hồ sơ tôi thấy kết quả như sau:
Đối xóa 1 triệu hàng trong cơ sở dữ liệu
TRUNC Bảng mất 3,46 giây. Trường hợp 2: mất 37.398 giây Trường hợp 1: mất vài phút. Đối với giải pháp của tôi, tôi sẽ đi với trường hợp 2, Nhưng tôi vẫn chờ giải pháp tốt hơn so với trường hợp 2 hoặc bằng cách nào đó cải thiện nó.
"làm điều đó trên phía máy chủ" như thế nào? bạn có nghĩa là bằng cách sử dụng một số kích hoạt? Điểm thứ hai giải pháp của bạn có vẻ như trường hợp 2, bạn có hài lòng với thủ tục lưu trữ tôi đã viết hoặc có một số cách tốt hơn để làm điều đó. Điểm 3 Ya Tôi đồng ý với bạn về Trường hợp 1 :) – MKMohanty
Khi bạn tạo một thủ tục đã lưu, bạn chỉ gửi cho máy chủ lệnh để thực hiện truy vấn; xóa từ thủ tục lưu sẵn được thực thi trên máy chủ. –
Bạn viết một cái gì đó như db.Database.SqlQuery ("exec DeleteUnnecessaryInfo @startdate", startdateParam) –