6

MVC3, ASP.NET 4.5, LINQ - Varlıklar, EF5 ve SQL Server 2008 R2 ve Azure (canlı için) kullanıyorum.TPH ve karmaşık türleri kullanırken LINQ to Entities ile ilk performans sorunu, Pregen Views hiçbir şey yapmıyor gibi görünüyor mu?

Model için ayrı bir Model Projesinde csdl, edml, msl ve ssdl dosyaları oluşturuyorum.

Bu dosyalar, varlık modelimi yönetdiğim Devart'ın Entity geliştiricisi tarafından üretildi.

Hedef: Varlık Çerçeve 5

  • Tembel Yükleme: Etkin
  • Görüntüle Nesil: yapı üzerinde Gerçek
  • Doğrulama: Doğru
  • Meta Veri Artefaktı İşleme: yerleştir Çıktı Meclis'te
  • ObjectContext olduğunu
  • ObjectContext Proxy Oluşturma Etkin: true.

Çocuk modelimde ayrıca 10'a kadar karmaşık türden (CTn) oluşan TPH kalıtımını model modelimde uyguladık.

Animal<-Cat(CT1,CT2,CT3 etc) (for example) 

Her karmaşık tür, genel Hayvan Tablosundaki sütuna eşler.

Benim ilk LINQ şudur: Bu ilk kez çalıştırıldığında

if (db.Animal.OfType<Cat>().Any(a => a.OwnerId == myOwnerId)) 

bunun tamamlanması yaklaşık 40 saniye sürebilir. Ardışık koşular yaklaşık 200 ms sürer. Ben harika bir SO soru keşfetti

Cat.MergeAs(0).Any(a => a.OwnerId == ((Nullable<int>)myOwnerId)) 

: Related SO Question ama yeterince derin gitmez

ben daha bir ORM Profiler kullanarak bu analiz

, bana olarak LINQ kodu verir. EF6'ya yükseltmeyi önerirken, EF çalışma zamanının ilk kullanımda JIT'e sahip olmasından dolayı yeni EF6 sorununu artık .NET çalışma zamanının dışında kaldığından bahsetmiyor. Belki de EF6 yani 6.1.2'nin sonraki bir sürümünde bu çözüldü.

T-SQL, EF tarafından oluşturulduktan sonra, kendi başına çok hızlı bir şekilde çalışır. Bunu SSMS'de test ettim. denenmiş pregenerated Görüntüleme sahip

1) nasıl TPH/Kompleks Tip senaryo için ilk yükleme gecikmeleri çözebilirsiniz:

Benim soru Kasım 2014 olarak, oluşur. "Derlenmiş Sorgular" referanslarını gördüm.

2) Belki de EF6'ya yükseltmeliyim? Fakat eğer yaparsam, şimdi EF çalışma zamanı için bir JIT cezası var mı ve bunu nasıl çözmeliyim. Azure Web Sitelerine dağıtıyorum. 3) Son olarak, önceden oluşturulmuş görüşlerden faydalanan diğer daha basit soruları tespit ettim, bu yüzden onları kullanıyorum. Sadece bu TPH/Kompleks Tipi scenerario için hiçbir etkisi yoktur. Pregen görüşlerin etkisinin olmadığı durumlar var mı?4) EF5'in şimdi yapabileceği "bir sorguyu otomatik olarak derleme" ye kadar geçen süreden dolayı olabilir 3). Görünümü önceden oluşturmuştu, sanırım bu bir sonraki darboğaz. Belki de benim gibi karmaşık varlıklar için bu "otomatik bileşen" özelliği uzun bir zaman alıyor, bu yüzden bir proaktif manuel derleme yapabilir miyiz? Quess'in "CompiledQuery" dediği şey bu. Bu ekstra kodu yazmak uygun mu, yoksa EF6x bana yardım eder mi? Bu sorgu derleme adımı darboğaz olduğunu güçlü bir önsözüm var, ama aynı zamanda derlenmiş sorguları yazma da mutlaka en kolay ve sürdürülebilir bir çözüm olmadığını fark ettim. Şu anda, tüm bu karmaşık varlıkları ısıtan bir periyodik başlangıç ​​işimiz var, böylece kullanıcı doğrudan "sıcak sorgu yürütme moduna" geçiyor.

Yukarıdakiler ile ilgili herhangi bir yardım büyük ölçüde takdir edilecektir.

Edit1

Sadece çok daha derin gider JetBrains en dotTrace Profile kullanmış, ve benim darboğaz de meydana geldiğini doğrular gibiydi: İlk vuruşunda

System.Data.Query.PlanCompiler.PreProcessor.Process(Dictionary[EdmFunctionEdmProperty[]]&) 

, bu% 99 harcıyor Burada, Sorgu Planı oluşturma ile ilgili bir şey olduğunu düşündüğümüzü doğrulayan zaman. Bu sorunu nasıl çözdüğüm başka bir konudur.

EDIT2

bazı iyi tavsiye sonra EF 6.1.2 üzerinde test etmek gidiyorum ve Pluralsight üzerinde Julie Lerman mükemmel seyrini takip ederek.

cevap

1

Benzer bir sorun yaşadım ve 'ilk vuruş' performansını artırmak için birden fazla yaklaşım denedim.

Önbelleğinizi önceden ısıtmak ve Entity Framework modeliniz aracılığıyla ilk aramayı veritabanınıza taşımak için IProcessHostPreloadClient uygulanmasını düşündünüz mü?

Bu çözüm

benim için çalıştı ve ben bir örnek PreWarmCache sınıfı aşağıda oluşturduk:

namespace MyNamespace 
{ 
    public class PreWarmCache : IProcessHostPreloadClient 
    { 
     private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); 
     private readonly SystemRepository _systemRepository = new SystemRepository(); 

     public void Preload(string[] parameters) 
     { 
      // Perform initialization and cache loading logic 
      Logger.Debug("Application Started: {0}", _systemRepository.InitAppliation() ? "DB response OK" : "DB response failed"); 
     } 
    } 
} 

kontrol dışarı this blog IIS üzerinde Otomatik Başlatma sağlayıcıya bu kanca ile ilgili ayrıntılar için.

+0

bunun için teşekkürler. Bunu deneyeceğim. Bu nesnenin sıcak kalmasını sağlamak için Pingdom tarafından adlandırılan bir ısınma dizisi çalıştırıyorum. İdeal değil, ama iş yapıyor. – SamJolly

İlgili konular