2013-05-08 31 views
13

Tôi có bảng cơ sở dữ liệu (chạy trên SQL Server 2012 Express) chứa ~ 60.000 hàng.Xóa một số lượng lớn bản ghi mất một thời gian RẤT NHIỀU

Tôi đang sử dụng đoạn mã sau để thanh trừng hàng cũ:

//Deleting CPU measurements older than (oldestAllowedTime) 
var allCpuMeasurementsQuery = from curr in msdc.CpuMeasurements where 
    curr.Timestamp < oldestAllowedTime select curr; 
foreach (var cpuMeasurement in allCpuMeasurementsQuery) 
{ 
    msdc.CpuMeasurements.Remove(cpuMeasurement); 
} 

Khi số hàng bị xóa là lớn (~ 90% hoặc nhiều bản ghi trong bảng đang được xóa) các hoạt động diễn đặc biệt Dài. Mất khoảng 30 phút để hoàn thành thao tác này trên một máy tương đối mạnh (máy tính để bàn Intel I5).

  1. điều này có vẻ giống như một hành vi bình thường không?

  2. bất kỳ ý tưởng nào về những gì tôi có thể làm để giảm thời gian hoạt động?

Cảm ơn,

+3

Nhìn vào DeleteAllOnSubmit, điều này có thể hữu ích. – DavidB

+2

AFAIK những gì bạn đang làm đang chạy hơn 60.000 lệnh xóa sẽ lặp lại cơ sở dữ liệu. Thay vào đó, nếu bạn chỉ có thể chạy một lệnh hoặc một vài trăm lệnh hoặc ít hơn, bạn sẽ không gặp phải vấn đề về hiệu suất đó. – Renan

+4

Khuôn khổ thực thể không phải là điều tuyệt vời. Có thể là tốt nhất để tạo một thủ tục lưu sẵn mà bạn vượt qua trong dấu thời gian và nó xóa tất cả các bản ghi theo cách đó. – Belogix

Trả lời

17

Khuôn khổ đối tượng không phải là rất tốt trong việc xử lý các hoạt động hàng loạt như thế này. Bạn nên sử dụng ExecuteStoreCommand để thực thi SQL trực tiếp đối với nguồn dữ liệu trong các tình huống như thế này.

var deleteOld = "DELETE FROM CpuMeasurements WHERE curr.Timestamp < {0}"; 
msdc.ExecuteStoreCommand(deleteOld, oldestAllowedTime); 

Bằng cách đó bạn không cần phải tải các đối tượng vào bộ nhớ (chỉ để xóa chúng) và phát hành hàng ngàn lệnh xóa cơ sở dữ liệu.

+0

+1, Đây là cách tôi cũng giải quyết nó –

+2

Tôi đánh giá cao tất cả các đề xuất ở đây. Tôi đang chọn giải pháp này cho bây giờ vì nó có vẻ là dễ nhất (ít nhất là với tôi). Tôi nghĩ rằng các giải pháp khác được đề cập ở đây có vẻ đầy hứa hẹn (EntityFramework.Extended), và tôi sẽ kiểm tra chúng khi mọi thứ bình tĩnh lại. – OSH

13

Bạn nên nhìn vào EntityFramework.Extended nó được tạo ra để giúp đỡ với cả xóa và cập nhật số lượng lớn.

Sử dụng nó, bạn chỉ có thể làm:

msdc.CpuMeasurements.Delete(curr => curr.Timestamp < oldestAllowedTime); 
-1

Xóa một lượng lớn dữ liệu có thể mất một thời gian dài.

Bạn có thể phải di chuyển sql ra khỏi ứng dụng của mình và chạy nó dưới dạng tập lệnh sql đơn qua SQL Server Agent. Nó có thể được chạy, ví dụ, một lần một ngày trong thời kỳ yên tĩnh nhất.

5

Lý do cho việc này là bạn thực hiện cập nhật DB cho mỗi bản ghi. Bạn cần cập nhật hàng loạt.

EntityFramework.extended có thể xử lý trường hợp này.

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