2012-02-13 9 views
30

"NoTracking" için ObjectQuery MergeOption bildiren bir sorgu yürütmeye çalışırken garip bir davranışım var, bu durumda varlık çerçevesi varlık durumunu izlemek için herhangi bir varlık eklemek ve ilgili ObjectStateEntry oluşturmamak gerekir. Biri, bir var mıVarlık Framework mergeoption hatalı performans notu

NoTracking belirtmek çalışırsanız

sorun yerine artış performansının Kötüleşebilir yani aynı sorgu varsayılan mergeoption ile 10 saniye (yani AppendingOnly olan) ve daha fazlası 1 dakika gibi sürer bunun için açıklama?

+0

Sorgu yürütmelerini nasıl ölçtünüz? –

+0

temel olarak bir ToList() – MaRuf

+0

ile yürütülen sorgudan önce ve sonra bir zaman damgası alarak Ama kaç kez sorguyu çalıştırıyorsunuz ve hangi yürütme sırasını kullanıyorsunuz? –

cevap

100

NoTracking birleştirme seçeneğini ayarlayarak değişiklik izlemeyi devre dışı bırakırsanız, nesnelere bağlama nesnelerine ait performans maliyetlerini kaydedersiniz, ancak öte yandan kimlik yönetimini de kaybedersiniz. Bu, potansiyel olarak çok daha fazla nesnenin - çoğu aynı anahtarla - gerçekleşeceği anlamına gelir.

Örnek: Gezinme özelliği olarak Roles koleksiyonuna sahip bir User varlığınız olduğunu varsayalım. Ayrıca, veritabanında 1 milyon kullanıcınız olduğunu ve tüm kullanıcıların aynı 10 rolde olduğunu varsayalım, yani her kullanıcının 10 öğeli bir rol koleksiyonu vardır. Eğer NoTracking kullanmazsanız

  • Eğer 1.000 sahip olacaktır: aşağıdaki sorguyu çalıştırırsanız ...

    var users = context.Users.Include("Roles").ToList(); 
    

    ... gerçekleşmiş ve örneği nesne sayısı birleştirme seçeneğine bağlıdır .010 nesneler, yani 1 milyon kullanıcı, ancak sadece 10 rol, çünkü kimlik eşlemesi, anahtar başına sadece 1 rolün gerçekleşmesini ve içeriğe eklenmesini sağlayacaktır. Aynı 10 rol örneği, tüm kullanıcıların Roles koleksiyonu için kullanılır.

  • Ancak, NoTracking'u kullanırsanız, EF içeriği bağlamlara eklemez, bu nedenle kimlik yönetimi devre dışı bırakılır ve 11.000.000 nesneye sahip olur: 1 milyon kullanıcı ve kullanıcı başına 10 rol örneği, örneğin 10 milyon rol nesneleri. Yani, nesneler içeriğe eklendikçe, 10 kattan fazla materyalize nesneye sahip olursunuz.

Nesne maddeleşme "moderate" performace costs ile sınıflandırılır:

Operasyon: materialising nesneleri
Bağıl Maliyet: Orta
Frekans: Her nesne kez için bir sorgunun döndürdüğü .

Yorumlar: geri DbDataReader nesnesini okuması ve nesneler yaratmak ve DbDataRecord sınıfının her bir durumda değerlerine dayanır özellik değerleri ayar süreci.nesne zaten ObjectContext içinde var ve sorgu bu sahne performansını etkilemez, birleştirme seçenekleri appendOnly veya PreserveChanges kullanıyorsa. Başka bir deyişle

: Sorgu NoTracking birleştirme seçeneğini kullanıyorsa, bu aşamada performansını etkiler ve özürlü değişiklik izleme performansı faydaları engelli kimlik yönetiminin sakıncaları ile yok edilmektedir mümkün olabilir ve çoğaltılmış nesne materyalizasyonu.

+1

Örnek çok açık! Harika! – kingkong0924

+3

(yavaş alkış) Aaaaand bu yüzden 70k puanınız var. aferin. – SteveCav