2016-03-02 21 views
5

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

Trả lời

0

Cách nhanh nhất để xóa dữ liệu hàng loạt là thực hiện điều đó ở phía máy chủ.

Trong trường hợp của bạn vì bạn muốn sử dụng khung thực thể, bạn nên tạo một thủ tục lưu sẵn với các tham số và execute quy trình lưu trữ này từ mã.

Khung thực thể chậm nếu bạn muốn sử dụng trường hợp 1; vì mỗi lần xóa nó tạo một truy vấn và thực thi nó.


Hãy thử một cái gì đó như thế này:

CREATE OR REPLACE PROCEDURE DeleteUnnecessaryData 
(endDate IN DATE) 
IS 
BEGIN 

    DELETE DBFOO where TOC < endDate; 

    COMMIT; 

END; 
+0

"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

+0

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ủ. –

+0

Bạn viết một cái gì đó như db.Database.SqlQuery ("exec DeleteUnnecessaryInfo @startdate", startdateParam) –

Các vấn đề liên quan