2009-03-22 13 views
8

Mi piace strumenti ORM, ma ho spesso pensato che per aggiornamenti di grandi dimensioni (migliaia di righe), sembra inefficiente per caricare, aggiornare e salvare quando qualcosa di simileGrandi aggiornamenti del database del volume con un ORM

UPDATE [table] set [column] = [value] WHERE [predicate] 

sarebbe dare prestazioni molto migliori.

Tuttavia, supponendo che si volesse percorrere questa rotta per motivi di prestazioni, come si sarebbe quindi assicurarsi che tutti gli oggetti memorizzati nella cache fossero aggiornati correttamente.

Supponiamo che tu stia utilizzando LINQ to SQL e hai lavorato su un DataContext, come assicurarti che l'UPDATE ad alte prestazioni si rifletta nel grafico dell'oggetto DataContext?

Questo potrebbe essere un "non si" o "utilizzare i trigger sul DB per chiamare il codice .NET che elimina la cache" ecc. Ecc., Ma sono interessato a conoscere soluzioni comuni a questo tipo di problema.

+0

non è uno dei motivi per l'utilizzo di un ORM? cioè che fornisce meccanismi per sincronizzare oggetti in memoria e oggetti memorizzati aggiornati? Il meccanismo sarà ovviamente ORM specifico –

+0

Sì, ma il mio punto è che se si utilizza uno strumento ORM e si desidera migliorare le prestazioni degli aggiornamenti di massa utilizzando un metodo SQL diretto, si perdono alcuni dei vantaggi di ORM. –

risposta

4

Hai ragione, in questo caso utilizzando un ORM per caricare, modificare e quindi i record di persistenza non è efficiente. Il mio processo più o meno così

1) l'uso implementazione All'inizio ORM, nel mio caso NHibernate, esclusivamente

2) Dato che lo sviluppo matura identificare i problemi di prestazioni, che includerà aggiornamenti di grandi dimensioni

3) refactoring quelli fuori a SQL o SP approccio

4) comando Usa Refresh (oggetto) per aggiornare gli oggetti memorizzati nella cache,

mio grosso problema è stato informare altri clienti che l'aggiornamento si è verificato. Nella maggior parte dei casi, abbiamo accettato che alcuni client siano obsoleti, come nel caso dell'uso standard di ORM, e quindi controlliamo un timestamp su update/insert.

2

Gli ORM sono ideali per lo sviluppo rapido, ma hai ragione: non sono efficienti. Sono fantastici in quanto non è necessario pensare ai meccanismi sottostanti che convertono gli oggetti in memoria in righe nelle tabelle e viceversa. Tuttavia, molte volte l'ORM non sceglie il processo più efficiente per farlo. Se ti interessa davvero le prestazioni della tua app, è meglio lavorare con un DBA per aiutarti a progettare il database e ad accordare le tue query in modo appropriato. (o almeno capire i concetti di base di SQL te stesso)

0

Gli ORM non saranno efficienti quanto l'SQL realizzato a mano. Periodo. Proprio come l'assemblatore fatto a mano sarà più veloce di C#. Indipendentemente dal fatto che la differenza di prestazioni sia importante dipende da molte cose. In alcuni casi, il livello più alto di ORM di astrazione ti dà forse più valore di una prestazione più elevata, in altri casi no.

Le relazioni di movimento con il codice oggetto possono essere molto belle ma, come giustamente sottolinea, ci sono potenziali problemi.

Detto questo, personalmente ritengo che ORms sia in gran parte una falsa economia. Non mi ripeterò qui ma indicherò semplicemente Using an ORM or plain SQL?

1

aggiornamenti di massa sono un disegno discutibile. A volte sembrano necessari; in molti casi, tuttavia, una migliore progettazione dell'applicazione può eliminare la necessità di aggiornamenti di massa.

Spesso, un'altra parte dell'applicazione ha già toccato ogni oggetto uno alla volta; l'aggiornamento "bulk" avrebbe dovuto essere eseguito nell'altra parte dell'applicazione.

In altri casi, l'aggiornamento prelude all'elaborazione altrove. In questo caso, l'aggiornamento dovrebbe far parte dell'elaborazione successiva.

La mia strategia di progettazione generale consiste nel rifattorizzare le applicazioni per eliminare gli aggiornamenti di massa.

+0

A volte l'aggiornamento collettivo non è un problema di progettazione, è un'attività. –

+0

@Candy Chiu: stai dicendo che non hai letto la risposta? O gli esempi specifici nella risposta non erano abbastanza chiari? Cosa significa il tuo commento? La semplice creazione di un aggiornamento collettivo perché qualcun altro ha detto "creare un aggiornamento collettivo" non affronta la discutibile decisione di progettazione. –

+0

"aggiorna i dati nel db con alcuni valori definiti dall'utente". In questo caso, se vengono toccate più righe, probabilmente c'è un problema di normalizzazione. Probabilmente le righe multiple dovrebbero essere state estratte in una tabella diversa in modo che un aggiornamento a riga singola eseguisse correttamente il lavoro. –

Problemi correlati