2010-10-19 12 views
6

Contexto: modelo dominio de documentos que tienen ediciones y Etiquetas.rendimiento nhibernate hidratación

¿Qué tipo de cifras esperarás al hidratarte con nHibernate?

Mi modelo de dominio no es muy complejo y cuando consulto todos los documentos obteniendo ediciones y etiquetas la consulta devuelve un poco más de 8000 filas de la base de datos, que a su vez están hidratadas en unos 2300 documentos.

La operación de la base de datos lleva unos 100ms y el proceso de hidratación lleva 4000ms, lo cual me parece muy extraño.

dotTrace indica un gran número de llamadas (1,6 M) a

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

y similares.

La consulta se realiza utilizando criterios como este:

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

Nota: Seguramente limitar el conjunto de resultados mejorará el rendimiento. Mi principal preocupación era por qué el mal rendimiento de hidratación en general. Jugando con session.FlushMode y session.CacheMode no ayuda mucho en mi caso.

ACTUALIZACIÓN: Aquí hay una captura de pantalla del generador de perfiles.

dotTrace

ACTUALIZACIÓN 2: comprobado los tiempos de consulta y que son unos 100 ms en absoluto.

+0

¿Puede publicar algunas capturas de pantalla de su perfil dotTrace? –

+0

Actualizado con una captura de pantalla. Tenga en cuenta que el mismo SQL Server y SQLite realizan lo mismo. – JensJ

+0

@JensJ, me resulta difícil creer que la llamada a DB demora 1 ms para devolver 8000 filas. –

Respuesta

0
  • ¿Has intentado una consulta sin usar DistinctRootEntityResultTransformer? (Puede que tenga que resolver el problema N + 1, pero hay soluciones para eso.)
  • ¿Ha activado el optimizador de reflexión?