2012-01-05 13 views
8

Estoy usando Apache Derby para almacenar una gran cantidad de filas del orden de 10s de Millones. Cada vez que inicio una inserción de lote, insertaré hasta 2 millones de filas más en la tabla. La tabla tiene un UUID como clave principal y un único contraint para un UUID en otra tabla. ¡El inserto tarda horas! Por qué ? He creado ÍNDICES en todas las tablas, pero desde entonces he eliminado esto, ya que creo que Derby crea automáticamente un ÍNDICE para cada tabla con una clave principal. estoy usando actualización por lotes con una declaración preparada como se muestra (en forma muy simple a continuación)Apache Derby INSERTOS son lentos

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(); 

Éstos son los resultados

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 

Como puedo insertar más y más filas, el proceso se vuelve más lento y más lento (probablemente debido al ÍNDICE). El modelo DB que tengo en este momento sirve bien a mis propósitos y soy reacio a cambiarlo. ¿Estoy haciendo algo mal? ... o esperando demasiado? ¿Hay alguna manera de mejorar la velocidad INSERT?


Editar

que ya se han ajustado la base de datos utilizando la confirmación automática y otros. Descubrí que al INSERTAR millones de registros, toma una cantidad irrazonable de tiempo para mi aplicación. SELECT en esta información es, por supuesto, muy rápido.

+0

¿Sabía que podría mantener los datos persistentes en el disco con Derby y cargar datos remotos a partir del último ID del registro? _ (Perdón por lo obvio.) _ –

Respuesta

8

¿Ha intentado desactivar el modo de confirmación automática? De http://db.apache.org/derby/docs/dev/tuning/tuningderby.pdf:

Las inserciones pueden ser muy lentas en el modo de confirmación automática porque cada confirmación implica una actualización del registro en el disco para cada instrucción INSERT. La confirmación no volverá hasta que se ejecute una escritura de disco físico. Para acelerar las cosas:

  • Ejecutar en modo de confirmación automática falsa, ejecuta una serie de inserciones en una sola transacción, y A continuación, emita una confirmación explícita.
  • Si su aplicación permite una carga inicial en la tabla, puede usar los procedimientos de importación para insertar datos en una tabla. Derby no registrará las inserciones individuales cuando se carga en una tabla vacía utilizando estas interfaces. Consulte el Manual de referencia de Derby y el Servidor Derby y la Guía de administración para obtener más información sobre los procedimientos de importación .
+0

Gracias por su respuesta. Ya he ajustado el DB usando autocommit y otros. Descubrí que al INSERTAR millones de registros, toma una cantidad irrazonable de tiempo para mi aplicación. SELECT en esta información es, por supuesto, muy rápido. Tuve que reestructurar mi base de datos para escribir una colección de objetos utilizando ProtocolBuffers funciona muy bien y es extremadamente rápido. El único problema es que tengo que cargar toda la colección de objetos cada vez que quiero usar los datos, pero esto es suficiente para mí. . –

+0

@AndyTudor - puede explicar: "He tenido que reestructurar mi base de datos para escribir una colección de objetos utilizando ProtocolBuffers funciona muy bien y es extremadamente rápido; el único problema es que tengo que cargar toda la colección de objetos siempre que quiera usar los datos". Me enfrento a un desafío similar y quiero saber si esto es algo que también puedo hacer ... – donlys

Cuestiones relacionadas