inserción de SQL por lotes

Tengo un archivo de texto con 50k + - líneas y cada línea contiene datos que deben extraerse de cada línea como un campo separado.

El programa se ejecuta varias veces al día.

Dado que esta aplicación es portátil, estoy usando SQLIite y leyendo cada una de esas 50k líneas una por una, recopilando los datos requeridos e insertándolos en el archivo SQlite DB a medida que avanza.

Hice algunas pruebas y descubrí que leer solo las líneas solo toma como el 10% del tiempo real que toma ahora, toda la sobrecarga viene cuando estoy insertando todos esos datos uno por uno en SQLite db.

Buscando sugerencias de mejora.

preguntado el 27 de agosto de 11 a las 20:08

2 Respuestas

Puede aumentar el rendimiento mediante transacciones, de modo que se soliciten varios INSERT a la vez, en lugar de uno para cada línea en su archivo de texto. Esto le permitiría generar sentencias INSERT por lotes (pruebe con algo así como 100 por lote); esto dará como resultado un aumento significativo del rendimiento.

Respondido 28 ago 11, 00:08

Dependiendo de la memoria disponible, 100 es un poco bajo; debería poder ir por alrededor de 5k si la lectura solo toma el 10% del tiempo. - Ben

Puede aumentar la velocidad de la siguiente manera:

  1. Ejecutando INSERTs en la transacción. Dependiendo de la cantidad de datos, puede ser una buena idea hacerlo en lotes de, por ejemplo. 1000 declaraciones.
  2. Utilice declaraciones preparadas, de modo que se minimice la sobrecarga de análisis de la consulta.
  3. Si tiene índices en la tabla de destino, a veces es bueno crear un TEMPORARY tabla con la misma estructura que la tabla de destino, rellénela con todos los datos y luego, al final, emita INSERT INTO target_table SELECT * FROM temporary_table.

Respondido 28 ago 11, 01:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.