2009-10-01 10 views
10

Mi empresa está en el proceso de reescribir una aplicación existente desde cero. Esta aplicación, entre otras tareas, realiza complejas consultas SQL contra pedidos y datos de facturas para producir informes de ventas. Las consultas se crean dinámicamente según los criterios seleccionados por el usuario, por lo que pueden ser bastante complejos si se seleccionan muchos criterios. Actualmente, el rendimiento es decente, pero no excelente.Rendimiento de ORM (especialmente NHibernate) para consultas complejas

Ahora, para la nueva versión, nos gustaría utilizar un ORM, probablemente NHibernate porque aparentemente es el único que admite Oracle Lite (la aplicación utiliza Oracle u Oracle Lite, dependiendo de si se está ejecutando conectado o desconectado modo). Pero me preocupa el rendimiento de las consultas generadas por NHibernate. He trabajado anteriormente con otros ORM (Linq to SQL, Entity Framework), pero las consultas fueron bastante simples, por lo que no hubo problemas de rendimiento.

Por lo tanto, antes de tomar una decisión sobre el uso de un ORM o me quedo con SQL simple, me gustaría saber qué tan bien estas herramientas manejan escenarios como uniones externas, subconsultas, etc. ... ¿Cree que un ORM (especialmente NHibernate) es adecuado para su uso en el escenario de informes descrito anteriormente? ¿Debería preocuparme por el rendimiento de las consultas complejas?

Cualquier información sería muy apreciada

Respuesta

8

Ver this chart. No hay DataObjects.Net por ahora, pero sus resultados en comparación con EF y NHibernate se muestran here.

código de prueba de LINQ para EF es here; las versiones para otras herramientas se pueden encontrar en la misma carpeta. Todos estos archivos .cs son generados por a single T4 template, por lo que las pruebas son completamente idénticas. El modelo usado allí es Northwind.

cuantos más enlaces:

+0

Algunos otros enlaces: http://fabiomaulo.blogspot.com/2009/09/why-don-choose-nhibernate.html y http: //fabiomaulo.blogspot .com/2009/08/nhibernate-perfomance-analisys.html :) –

+0

Alex, gracias, ¡este sitio parece realmente prometedor! Ahora necesito dedicar algo de tiempo a diseccionar los resultados de las pruebas;) –

+0

Acerca de las consultas complejas: aquí todo depende de la calidad del traductor LINQ. El traductor de NH LINQ parece completamente correcto cuando funciona. Tenga en cuenta que estas pruebas muestran lo que un ORM particular _can_traducir, pero no _how_. Las pruebas de rendimiento están diseñadas para consultas simples, por lo que no debe estudiarlas seriamente. Aunque v.g. las pruebas de búsqueda muestran alguna diferencia en la calidad de la traducción: algunos proveedores siempre usan ROWNUMBER en lugar de TOP, y esta es la razón principal por la que pierden en esta prueba. –

6

NHibernate tiene un poco de una curva de aprendizaje, pero es bien vale la pena aprender como cualquier tiempo dará sus frutos con creces. Recomendaría NHibernate en Action book para aprender, ya que es un excelente recurso y cubre todo lo que tu pregunta y mucho más.

El rendimiento de NHibernate puede ajustarse (ver los enlaces a continuación) y NHibernate tiene un sólido mecanismo de almacenamiento en caché.

http://www.codeproject.com/KB/database/NHibernate_Perf.aspx https://www.hibernate.org/hib_docs/nhibernate/html/performance.html

última instancia, el rendimiento será determinado por quien escribe las consultas, ya que es en SQL.

+0

Gracias por el consejo, esto parece interesante –

+0

También mencionaría la serie de screencast "Summer of NHibernate" - ¡la única razón por la que la estoy usando hoy! ¡Steve Bohlen hace un gran trabajo al recorrer cada detalle de NHibernate! http: //www.summerofnhibernate.com/ –

5

Si está buscando ORM con un traductor LINQ completo y eficiente, le recomiendo que pruebe Entity Framework o DataObjects.Net. No estoy seguro del soporte de Oracle Lite. El traductor LINQ de NHibernate aún no está completamente terminado.

De todos modos, lo mejor que puede hacer ahora es descargar principales herramientas ORM y probarlos en consultas complicadas con la agrupación, unión, etc. subconsultas

+0

Gracias por su respuesta. Lamentablemente, EF no es una opción (aunque hubiera sido mi primera opción). Existen proveedores de EF para Oracle (Devart, DataDirect), pero no para Oracle Lite, y probablemente nunca haya uno porque Oracle Lite no se usa ampliamente. Y DataObjects.Net aparentemente aún no es compatible con Oracle ... –

Cuestiones relacionadas