2010-10-19 7 views
6

Kontext: Domain-Modell Dokumente mit Editions und Schlagwörter.nhibernate Hydratisierungsleistung

Welche Art von Figuren werden Sie erwarten, wenn Sie mit nHibernate hydratisieren?

Meine Domain-Modell nicht sehr komplex und wenn ich alle Dokumente abrufende Editionen sowie Tags abfragen gibt die Abfrage etwas mehr als 8000 Zeilen aus der Datenbank - die wiederum in etwa 2300 Dokumente hydratisiert sind.

Die Datenbankoperation dauert etwa 100ms und der Hydrationsprozess dauert 4000ms, was ich sehr seltsam finde.

DotTrace gibt eine große Anzahl von Anrufen (1,6 M) zu

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

und dergleichen.

Die Abfrage wird unter Verwendung von Kriterien wie folgt aus:

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

Hinweis: Sicherlich die resultset Begrenzung wird die Leistung verbessern. Meine Hauptsorge war, warum die schlechte Hydratationsleistung im Allgemeinen. Fummelei mit Session.FlushMode und session.CacheMode hilft mir in meinem Fall nicht viel.

UPDATE: Hier ist ein Screenshot vom Profiler.

dotTrace

UPDATE 2: Auf die Abfragezeiten, und sie sind etwa 100 ms in allen.

+0

Können Sie einige Screenshots Ihres dotTrace Profilings posten? –

+0

Mit einem Screenshot aktualisiert. Beachten Sie, dass sowohl SQL Server als auch SQLite dasselbe ausgeführt haben. – JensJ

+0

@JensJ, ich finde es schwer zu glauben, dass der DB-Aufruf 1 ms dauert, um 8000 Zeilen zurückzugeben. –

Antwort

0
  • Haben Sie eine Abfrage ohne Verwendung von DistinctRootEntityResultTransformer versucht? (Möglicherweise müssen Sie das N + 1 Problem lösen, aber es gibt Lösungen dafür.)
  • Haben Sie den Reflexionsoptimierer eingeschaltet?