2013-05-08 16 views
13

Yaklaşık 60.000 satır içeren bir veritabanı tablomuz var (SQL Server 2012 Express'te çalışıyor). Eski satırları temizlemek için aşağıdaki kodu kullanıyorumÇok sayıda kaydı silmek çok uzun bir süre alır

: (tablolardaki kayıtların% 90 veya daha fazla siliniyor ~) silinen satır sayısı büyük olduğunda

//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); 
} 

operasyon son derece alır uzun. Bu işlemi nispeten güçlü bir makinede (Intel I5 masaüstü) bitirmek yaklaşık 30 dakika sürer.

  1. Bu normal bir davranış gibi görünüyor mu?

  2. İşlem süresinin kısaltılması için neler yapabileceğimiz hakkında herhangi bir fikir var mı? Sen EntityFramework.Extended bakmak gerekir

sayesinde

+3

DeleteAllOnSubmit'e bakın, bu yardımcı olabilir. – DavidB

+2

Yaptığınız AFAIK 60.000'den fazla veritabanını çalıştıran komutları siliyor. Bunun yerine, yalnızca bir komut veya birkaç yüz komuttan oluşan bir toplu iş çalıştırırsanız, bu performans sorununa sahip olmazsınız. – Renan

+4

Entity Framework bu tür şeylerde harika değildir. Zaman damgasında ilettiğiniz saklı bir yordam oluşturmak en iyisi olabilir ve tüm kayıtları bu şekilde siler. – Belogix

cevap

17

Varlık yapısı bu gibi toplu işlemlerde çok iyi değildir. Böyle durumlarda SQL'i doğrudan veri kaynağına karşı çalıştırmak için ExecuteStoreCommand kullanmalısınız.

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

Böyle yaparak veritabanına silme komutları binlerce (bunları silmek için) belleğe varlıkları yüklemek ve sorunu gerekmez.

+0

+1, Ben de bu şekilde çözdüm. –

+2

Burada tüm önerileri takdir ediyorum. Bu çözümü şu an için en kolay şekilde seçiyorum (en azından benim için). Burada sözü edilen diğer çözümlerin umut vaat ettiğini düşünüyorum (EntityFramework.Extended), ve işler sakinleştiğinde kontrol edeceğim. – OSH

13

o toplu silme ve güncellemeler hem yardımcı olmak için oluşturuldu.

Bunu kullanarak, basitçe yapabileceği:

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

uzun zaman alabilir büyük miktarda veriyi silme.

sql'nizi uygulamanızdan çıkarmanız ve SQL Server Agent aracılığıyla tek bir sql komut dosyası olarak çalıştırmanız gerekebilir. Örneğin, en sessiz dönemde günde bir kez çalıştırılabilir.

5

Bunun nedeni, her bir kayıt için bir DB güncelleştirmesi yürütmenizdir. Toplu bir güncelleme yapmalısınız. Bu senaryoyu işbu belgeyi halledebilir

EntityFramework.extended.

İlgili konular