2008-12-19 19 views
6

Al haberme quedado atrás en el mundo de ORM y el acceso a los datos modernos, estoy buscando alejarme de DataSets (estremecimiento) y ponerme en un marco de mapeo adecuado.NHibernate efficiency

Estoy a punto de familiarizarme con Linq en SQL, y ahora estoy investigando NHibernate con miras a utilizarlo en nuestro próximo proyecto.

Con old school sql y conjuntos de datos, sus consultas sql obviamente solo devuelven los datos que desea. También entiendo que L2S también es lo suficientemente inteligente como para evaluar sus cláusulas where para que solo devuelva los objetos que solicitó. ¿NHibernate es lo mismo? ¿Y es lo mismo con Ayende's Linq a NHibernate?

Con esto quiero decir, si lo hago el equivalente a:

Select * from customers where name = "fred" 

va a buscar a todos los clientes en la memoria, y luego filtrar los no freds, o es lo suficientemente inteligente como para sólo recibe lo que se necesidades en primer lugar?

Si es inteligente, ¿cuáles son las advertencias? ¿Hay algún tipo de consulta que no se puede evaluar de esta manera? ¿Qué problemas de rendimiento debo tener en cuenta?

Gracias

Andrew

Respuesta

8

Una respuesta rápida es que el ORM comprobará el nombre de propiedad y transformarla en una consulta SQL que no le hará name = .... Por lo tanto, no se cargará todos los clientes en la memoria para buscar el nombre.

4

Nhibernate viene con un par de formas diferentes de consultar la base de datos. Hibernate usa una sintaxis similar a Sql llamada HQL, que es SQL en objetos. También puede hacer una búsqueda por ejemplo, donde crea un objeto y rellena el criterio que desea, luego hibernate extraerá el objeto del DB que tiene los mismos valores de propiedad.

echar un vistazo aquí que te llevará hasta la velocidad summer of Nhibernate lession 2 y 2a responderá con mayor profundidad

HTH

huesos

1

Sí, NHibernate debe ser uno de los ORM mas potente allá afuera, lo había usado en un proyecto y fue genial. Acerca de LINQ a NHibernate you may want to check this article. Hay una curva de aprendizaje (NHQL e ICriteria) y si quieres hacer el salto va a ser difícil al principio, pero luego todo el tiempo invertido vuelve a ti. Espero que esto ayude.

3

SI realmente está preocupado por las consultas que NHibernate está generando, ejecute el Analizador de SQL Server y descubra qué se está ejecutando o configure su registro y active su salida de SQL. Mostrará todas las declaraciones SQL a donde configura su log4net.

+0

No estoy * preocupado * Solo estaba tratando de establecer los hechos. ¿Has visto el perfilador nhibernate de Ayende? –

+0

Solo he visto lo que puso en su blog. Parece realmente limpio. Sí, lo siento por el fraseo, curioso hubiera sido una palabra mejor. Sé personalmente que configuré log4net para atrapar algunos desagradables escenarios de N + 1. – Min

1

NHibernate creará una consulta similar a su ejemplo si utiliza HQL o ICriteria, pero en realidad le hará una mejor idea. Creará una instrucción sql parametrizada para que la consulta se almacene en caché en SQL Server.

El ICriteria es extremadamente flexible, sin embargo, hay una pequeña curva de aprendizaje para dominarlo. Yo también recomiendo el verano de screencasts de nhibernate para ponerme al día rápidamente.

1

Es algo simple de lograr el rendimiento de clase "empresarial" con NHibernate.

En función de las asignaciones de propiedades y relaciones en el objeto, el ORM generará una consulta específica para esa búsqueda. Si una propiedad se marca como carga diferida, se excluirá y cuando se acceda a la propiedad dentro de la sesión, una recuperación posterior obtendrá solo esa parte de datos faltantes. Así que si tuviéramos que activar el generador de perfiles de SQL de la consulta traducida le gustaría algo como esto

Select cust.Address, cust.Email from customers cust where cust.Name = "fred" 

También es importante la profundidad de la consulta. Podemos limitar el número de registros que se devuelven (importante para conjuntos de datos grandes) mediante consultas HQL que colocan los datos según el proveedor de su base de datos ... siempre que trabajen con el analizador HQL. También puede establecer FetchMode o CollectionFetchMode en las correlaciones de relaciones que realizarán combinaciones para seleccionar de varias tablas en una sola interacción.

Si está utilizando el servidor SQL, puede activar sp_execsql que ejecutará todas las búsquedas a través de un proceso almacenado para un aumento rápido del rendimiento.

Para obtener más información, hay un excelente artículo en Code Project que proporciona detalles sobre cómo mejorar el rendimiento de NHibernate en su aplicación. Si está utilizando una arquitectura orientada a servicios, la latencia puede ser una gran preocupación. Consulte this thread para obtener más detalles sobre eso.

0

Se ha eliminado el desarrollo de SQL de Linq a entidades. Deberías intentarlo también.