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.
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.) _ –