2010-10-19 4 views
6

Bağlam: Editions ve Etiketler sahip Belgelerin ait Alan modeli.nhibernate hidratasyon performans

nHibernate kullanarak nemlendirirken ne tür rakamlar beklersiniz?

Etki alanı modelim çok karmaşık değil ve tüm Dokümanları Edisyonları almanın yanı sıra Etiketleri sorguladığımda, sorgu, veritabanından 8000 satırdan biraz daha fazla döndürür - bu da sırayla 2300 Belge içine hidratlanır.

Veritabanı işlemi yaklaşık 100 ms sürer ve hidrasyon işlemi çok tuhaf bulduğum 4000 ms alır.

dotTrace

"System.Data.SQLite.SQLite3.ColumnName (SQLiteStatement, Int32)"

ve benzerleri çağrıları (1.6M) içindeki bir sayıda olduğunu gösterir. Böyle

sorgu kullanılarak gerçekleştirilir Kriterler:

var docsQuery = _session.CreateCriteria<Document>();    
docsQuery.SetFetchMode("Editions", FetchMode.Join); 
docsQuery.SetFetchMode("Tags", FetchMode.Join); 
docsQuery.SetResultTransformer(new DistinctRootEntityResultTransformer()); 
return docsQuery .List<Document>(); 

Not: Şüphesiz resultset sınırlayıcı performansını arttıracaktır. Benim temel endişem genel olarak kötü hidrasyon performansının nedeniydi. session.FlushMode ve session.CacheMode ile Oynanmış benim durumumda çok yardımcı olmuyor.

GÜNCELLEME: İşte profil görüntüleyicisinden.

dotTrace

GÜNCELLEME 2: sorgu kez kontrol ve onlar hakkında 100ms hepsi içindedir.

+0

DotTrace profilinizin bazı ekran görüntülerini gönderebilir misiniz? –

+0

bir ekran görüntüsü ile güncellendi. Aynı SQL Server ve SQLite aynı şeyi gerçekleştirdiğini unutmayın. – JensJ

+0

@JensJ, zor DB çağrı 8000 satırları döndürmek 1ms zaman inanmak zor. –

cevap

0
  • DistinctRootEntityResultTransformer kullanmadan bir sorguyu denediniz mi? (N + 1 sorununu çözmeniz gerekebilir, ancak bunun için çözümler vardır.)
  • Yansıma iyileştiricisini açtınız mı?