2009-07-17 7 views
6

Soggetto a questa domanda, chiede tutto: quanto è efficace il metodo executeBatch? Esiste un benchmark delle prestazioni, che dice ... 'se si hanno 1000 record da inserire, usando executeBatch invece di executeUpdate si risparmia x quantità di cicli del database?'Quanto è efficace esecuzione su una dichiarazione preparata?

Oppure questa è solo una convenzione?

MODIFICA: Ecco a cosa sto lavorando: un DB2 V 8.1 ospitato su Z/OS, un'app Web che inserirà 80.000 record contemporaneamente nella peggiore delle ipotesi di esecuzione dello scenario.

+2

Piuttosto che avere tutti i numeri lanosi, perché non provarlo per te stesso e misurarlo? Solo tu puoi sapere quanti benefici otterrai dal tuo set-up. – skaffman

+1

@skaffman Non voglio fare ciò che viene comunemente chiamato ottimizzazione prematura. Vorrei tuttavia, vorrei capire quanto sia significativamente più veloce. – Jay

+0

Lo capisco, ma non puoi fare una scelta informata senza un po 'di benchmarking. – skaffman

risposta

8

Non sicuro quale database si sta utilizzando. Quando ho eseguito un test su questo utilizza DB2 questo è quello che ho visto:

di scrivere nel database:

1 inserto ci sono voluti 2500 microsecondi.

10 inserimenti ci sono voluti 6000 microsecondi. (600 microsecondi per scrittura)

10000 inserimenti ci sono voluti circa 1 milione di microsecondi. (100 microsecondi per scrittura)

Prestazioni massime. Tutto ciò significa che c'è un enorme sovraccarico nell'invio di messaggi e l'utilizzo di un metodo batch minimizza questo. Ovviamente, l'invio di inserti/aggiornamenti in lotti enormi comporta il rischio di perderli in caso di arresto anomalo dell'applicazione.

Nota: i numeri esatti variano a seconda del DB e delle impostazioni. Quindi dovrai trovare il tuo "punto debole". Ma questo ti dà un'idea.

+0

@windfinder hai usato executeBatch per tutto quanto sopra? E hai detto che "i grossi lotti corrono il rischio di perdersi nei crash dell'applicazione" - se sto usando la gestione delle transazioni - dovrei essere bravo in questo scenario? – Jay

+0

Sì, ho usato executeBatch. La gestione delle transazioni non eliminerà completamente questo rischio, ma potrebbe ridurlo. – Alex

+0

Nel modo più semplice, se dovessi impostare autocommit su false e commit solo quando viene restituito executeBatch, come sono a rischio? – Jay

1

Non sono sicuro di cosa stai chiedendo, ma per l'inserimento di molte migliaia di righe, una dichiarazione batch è estremamente più veloce. Non posso darti dei numeri, però.

+0

@skaffman quella era la mia domanda - quanto è più veloce? Puoi darmi un'approssimazione? – Jay

+0

Avrei stimato da qualche parte tra 10 e 20 volte, dipenderebbe in larga misura dal database stesso. Un'istruzione non batch coinvolge molto più traffico di rete, quindi un server di rimozione trarrebbe maggiore beneficio dal batching di uno locale, ad esempio. – skaffman

+1

Più di 10-20 volte nella mia esperienza (per il mio particolare caso d'uso). –

1

Secondo la mia esperienza, è notevolmente più veloce, anche se si inseriscono/aggiornano solo pochi record alla volta. Se si sta effettuando più di un aggiornamento, consiglierei quasi sempre di raggrupparli se ha senso.

Detto questo, dovresti fare dei test effettivi per capire il miglioramento delle prestazioni per la tua situazione particolare.

0

specifica JDBC Capitolo 14 dice che la presentazione più istruzioni SQL, invece di singolarmente, può notevolmente migliorare le prestazioni

0

Nel batchExecute() istruzioni di aggiornamento stanno prendendo più tempo quindi inserire dichiarazioni Tring con 5001 di inserimento e aggiornamento dichiarazioni razione di prestazione è 15:84

+0

E dov'è la risposta? – Rizier123