2009-10-01 3 views
10

La mia azienda sta procedendo alla riscrittura di un'applicazione esistente da zero. Questa applicazione, tra le altre attività, esegue query SQL complesse su dati di ordini e fatture per produrre report di vendita. Le query vengono create dinamicamente in base a quali criteri vengono selezionati dall'utente, quindi possono essere piuttosto complessi se vengono selezionati molti criteri. Attualmente, le prestazioni sono decenti, ma non eccezionali.Prestazioni ORM (specialmente NHibernate) per query complesse

Ora, per la nuova versione, vorremmo utilizzare un ORM, probabilmente NHibernate perché apparentemente è l'unico che supporta Oracle Lite (l'applicazione utilizza Oracle o Oracle Lite, a seconda che sia in esecuzione in connessione o disconnessa modalità). Ma sono preoccupato per le prestazioni delle query generate da NHibernate. Ho lavorato con altri ORM (Linq to SQL, Entity Framework), ma le query erano piuttosto semplici, quindi non c'era alcun problema di prestazioni.

Quindi, prima di prendere una decisione sull'utilizzo di un ORM o stare con SQL semplice, mi piacerebbe sapere quanto bene questi strumenti gestiscono scenari come join esterni, sottoquery, ecc ... Pensi che un ORM (soprattutto NHibernate) è adatto per l'uso nello scenario di segnalazione descritto sopra? Dovrei preoccuparmi delle prestazioni per query complesse?

Qualsiasi commento sarebbe molto apprezzato

risposta

8

Vedi this chart. Non c'è DataObjects.Net per ora, ma i suoi risultati in confronto a EF e NHibernate sono mostrati here.

Il codice di test LINQ per EF è here; versioni per altri strumenti possono essere trovate nella stessa cartella. Tutti questi file .cs sono generati da a single T4 template, quindi i test sono completamente identici. Il modello utilizzato è Northwind.

Pochi altri links:

+0

Alcuni altri link: http://fabiomaulo.blogspot.com/2009/09/why-don-choose-nhibernate.html e http: //fabiomaulo.blogspot .com/2009/08/nhibernate-perfomance-analisys.html :) –

+0

Alex, grazie, questo sito sembra davvero promettente! Ora ho bisogno di dedicare un po 'di tempo alla dissezione dei risultati del test;) –

+0

Per quanto riguarda le query complesse: qui tutto dipende dalla qualità del traduttore LINQ. Il traduttore di NH LINQ sembra completamente raddrizzato quando funziona. Nota che questi test mostrano cosa un particolare ORM _can_ traduce, ma non _how_. I test delle prestazioni sono progettati per query semplici, quindi non dovresti studiarli seriamente. Sebbene ad es. I test di paging mostrano alcune differenze nella qualità della traduzione: alcuni provider usano sempre ROWNUMBER invece di TOP, e questo è il motivo principale per cui perdono questo test. –

6

NHibernate ha un po 'di una curva di apprendimento, ma ne vale la pena di imparare come qualsiasi tempo trascorso pagherà molte volte. Vorrei raccomandare NHibernate in Action book per l'apprendimento in quanto è una risorsa eccellente e copre tutto ciò che la tua domanda chiede e molto altro ancora.

Le prestazioni di NHibernate possono essere regolate (vedere i collegamenti di seguito) e NHibernate dispone di un robusto meccanismo di memorizzazione nella cache.

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

In definitiva la prestazione sarà determinato da chi scrive le query come in SQL.

+0

Grazie per il consiglio, questo sembra interessante –

+0

Vorrei anche citare la serie di screencast "Estate di NHibernate" - l'unico motivo per cui lo sto usando oggi! Steve Bohlen fa un ottimo lavoro camminando attraverso ogni dettaglio di NHibernate! http: //www.summerofnhibernate.con/ –

5

Se stai cercando ORM con un traduttore LINQ completo ed efficiente, ti consiglio di provare Entity Framework o DataObjects.Net. Non sono sicuro del supporto Oracle Lite. Il traduttore LINQ di NHibernate non è ancora completamente completato.

In ogni caso la cosa migliore che puoi fare ora è quello di scaricare gli strumenti principali ORM e testarli su query difficile con il raggruppamento, unendo, subqueries ecc

+0

Grazie per la risposta. Sfortunatamente EF non è un'opzione (anche se sarebbe stata la mia prima scelta). Esistono provider EF per Oracle (Devart, DataDirect), ma non per Oracle Lite e probabilmente non ce ne sarà mai uno perché Oracle Lite non è ampiamente utilizzato. E DataObjects.Net a quanto pare non supporta Oracle ancora ... –