2012-01-05 19 views
8

Sto usando Apache Derby per memorizzare un numero elevato di righe nell'ordine di 10s di milioni. Ogni volta che avvierò un inserimento batch, inserirò fino a 2 milioni di righe in più nella tabella. La tabella ha un UUID come chiave primaria e un singolo contrappeso a un UUID in un'altra tabella. L'inserto richiede ore !!! Perché ? Ho creato degli INDICE su tutte le tabelle, ma da allora ho rimosso questo aspetto perché credo che Derby crei automaticamente un INDICE per ogni tabella con una chiave primaria. Sto usando aggiornamento batch con una dichiarazione preparata come mostrato (in forma molto semplice sotto)Gli INSERTS di Apache Derby sono lenti

final PreparedStatement addStatement = connection.prepareStatement(...) 
int entryCount = 0; 
    for (final T entry : entries) { 
    addStatement.addBatch(); 
    entryCount++; 
    if (entryCount % 1000 == 0) { 
    addStatement.executeBatch(); 
    addStatement.clearBatch(); 
    entryCount = 0; 
    } 
addStatement.close(); 

Ecco i risultati

05/01/12 12:42:48 Creating 2051469 HE Peaks in DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 12:44:18 Progress: Written (10%) 205146/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 12:46:51 Progress: Written (20%) 410292/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 12:50:46 Progress: Written (30%) 615438/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 05/01/12 12:56:46 Progress: Written (40%) 820584/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:04:29 Progress: Written (50%) 1025730/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:13:19 Progress: Written (60%) 1230876/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:22:54 Progress: Written (70%) 1436022/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:34:53 Progress: Written (80%) 1641168/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:47:02 Progress: Written (90%) 1846314/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:58:09 Completed: Written (100%) 2051469/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE - Time Taken:01:15:21 

Come inserisco sempre più righe, il processo diventa più lento e più lento (probabilmente per l'INDICE). Il modello DB che ho al momento serve bene i miei scopi e sono riluttante a cambiarlo. Sto facendo qualcosa di sbagliato? ... o ti aspetti troppo? C'è un modo per migliorare la velocità INSERT?


Modifica

ho già stato messo a punto il DB usando autocommit e altri. Ho scoperto che quando si inseriscono milioni di record, è necessaria una quantità irragionevole di tempo per la mia applicazione. SELEZIONA su questi dati è ovviamente molto veloce.

+0

Si sa che è possibile mantenere i dati persistenti su disco con Derby e caricare dati remoti a partire dall'ultimo ID del record? _ (Ci scusiamo per l'ovvio.) _ –

risposta

8

Hai provato a disattivare la modalità di autocommit? Da http://db.apache.org/derby/docs/dev/tuning/tuningderby.pdf:

Gli inserimenti possono essere dolorosamente lenti in modalità di autocommit poiché ogni commit implica un aggiornamento del registro sul disco per ogni istruzione INSERT. Il commit non verrà restituito fino a . Viene eseguita una scrittura del disco fisico. Per accelerare le cose:

  • Run in modalità autocommit falsa, eseguire una serie di inserti in una transazione, e poi esplicitamente emettere un commit.
  • Se l'applicazione consente il caricamento iniziale nella tabella, è possibile utilizzare le procedure di importazione per inserire dati in una tabella. Derby non registra i singoli inserimenti quando si carica in una tabella vuota utilizzando queste interfacce. Consultare il manuale Derby Manuale e il Derby Server and Administration Guide per ulteriori informazioni sulle procedure di importazione .
+0

Grazie per la risposta. Sono già stato sintonizzato sul DB usando autocommit e altri. Ho scoperto che quando si inseriscono milioni di record, è necessaria una quantità irragionevole di tempo per la mia applicazione. SELEZIONA su questi dati è ovviamente molto veloce. Ho dovuto ristrutturare il mio DB per scrivere una collezione di oggetti usando ProtocolBuffers funziona molto bene ed è estremamente veloce - l'unico problema è che devo caricare l'intera collezione di oggetti ogni volta che voglio usare i dati - ma questo è sufficiente per me . –

+0

@AndyTudor - puoi spiegare: "Ho dovuto ristrutturare il mio DB per scrivere una collezione di oggetti usando ProtocolBuffers funziona molto bene ed è estremamente veloce - l'unico problema è che devo caricare l'intera collezione di oggetti ogni volta che voglio usare i dati". Sto affrontando una sfida simile e voglio sapere se questo è qualcosa che posso fare anche io .. – donlys

Problemi correlati