Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Problemas de tiempo al insertar con sqlite

Estas en el tema de Problemas de tiempo al insertar con sqlite en el foro de Bases de Datos General en Foros del Web. Buenas Tengo el siguiente problema, en mi aplicacion java tengo que hacer una insercción de unos 1000 elementos en una tabla que a penas tiene ...
  #1 (permalink)  
Antiguo 09/06/2014, 05:36
 
Fecha de Ingreso: mayo-2013
Mensajes: 28
Antigüedad: 10 años, 11 meses
Puntos: 0
Problemas de tiempo al insertar con sqlite

Buenas

Tengo el siguiente problema, en mi aplicacion java tengo que hacer una insercción de unos 1000 elementos en una tabla que a penas tiene 5 campos (3 campos en la inserccion y dos con valores por defecto). El código es el siguiente:

Código SQL:
Ver original
  1. INSERT INTO tabla (campo1, campo2, campo3) VALUES (?,?,?)
Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.
He probado tambien a hacerlo con addBatch() y al final executeBatch() a quitar la Foreign Key (campo3) y hacerla como un campo normal, pero no consigo que para una insercción de alrededor de 1000 elementos tarde menos de 4-5 minutos, lo cual es inadmisible en la aplicación que estoy desarrollando. ¿Alguna idea o sugerencia de como podria arreglar este problema?


Saludos y gracias de antemano
  #2 (permalink)  
Antiguo 09/06/2014, 05:45
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problemas de tiempo al insertar con sqlite

Si haces inserciones iterativas, serán lentas en cualquier DBMS que uses, así fuese Oracle, DB2, SQL Server, PosgreSQL, MySQL... o SQLite. Es igual, porque se realiza una a una indefectiblemente, y allí estás afectados por los cambios de contexto del sistema (overhead), por la actualización de índices, las validaciones de FK, etc., etc., etc...
Los únicos caminos prácticos son inserts masivos, los que pueden ser o bien insertando todo desde un archivo plano, con los datos correctamente formateados (no sé si SQLite lo admite), o bien crear un único INSERT con N grupos de valores, que dependerá de lo que Java pueda hacer.
Esta última opcion es lo que equivale a:
Código SQL:
Ver original
  1. INSERT INTO tabla (campo1, campo2, campo3)
  2. VALUES (?,?,?), (?,?,?), (?,?,?), (?,?,?), (?,?,?), (?,?,?),...
El problema de la segunda opción es que si no me equivoco no podrás usar variables para poner los datos paramétricamente. Probablemente debas resolverlo como una cadena de caracteres.
Peor eso ya es tema de programación (off-topic de este foro).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 09/06/2014, 06:09
 
Fecha de Ingreso: mayo-2013
Mensajes: 28
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Problemas de tiempo al insertar con sqlite

Lo hice tambien así y tarda igualmente 4-5 minutos... le he creado tambien distintos indices y nada.
  #4 (permalink)  
Antiguo 09/06/2014, 06:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problemas de tiempo al insertar con sqlite

Los índices que le generes harán que las inserciones sean más lentas, no más rápidas.
Los índices aceleran la búsqueda de datos.


Una de las soluciones que encontré, buscando muy poco en Google fue usar un modo algo rústico, pero que aparentemente podría funcionar. Habría que probarlo:
Código SQL:
Ver original
  1. INSERT INTO mytable (col1, col2)
  2. SELECT 'a','b'
  3. UNION
  4. SELECT 'c','d'
  5. UNION ...
donde los grupos (a, b) , (c, d) y sucesivos, son los diferentes sets de valores de cada registro.
Por un consejo básico, no intentes mandar los 1.000 registros de un solo saque. Envía a ejecutar los inserts por grupos de 100 registros, aunque eso implique una doble iteración.
No es tan difícil de programar como puede sonar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 18/06/2014, 05:13
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 137
Antigüedad: 14 años, 7 meses
Puntos: 12
Respuesta: Problemas de tiempo al insertar con sqlite

Hola

Aquí tienes un ejemplo de cómo mejorar el rendimiento de SQLite insertando muchos registros:

http://www.nosinmiubuntu.com/2012/03/como-mejorar-el-rendimiento-en-sqlite.html

Saludos
  #6 (permalink)  
Antiguo 18/06/2014, 05:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problemas de tiempo al insertar con sqlite

@jc_moj, esa es una solución por programación, tema que si te fijas en las reglas del foro de BBDD, es OFF TOPIC.
De todos modos, la primera parte de la soución propuesta se trata de crear programáticament lo mismo que le planteo en la primera solución. Ese sería el método usual para manejarlo en muchos lenguajes. El problema de la lentitud, según dice en su contestación, sigue sin resolverse de ese modo.

Ahora bien, si @ico87 quiere una solución por programación, tendré que mover el post a otro foro, porque ya no se trataría de una solución por BBDD.

Por favor, lee las reglas que cada subforo tiene para si mismo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 18/06/2014, 15:51
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 137
Antigüedad: 14 años, 7 meses
Puntos: 12
Respuesta: Problemas de tiempo al insertar con sqlite

Hola

@gnzsoloyo es cierto que es por programación, la parte del artículo a la que yo me refería es la de usar una única transacción para guardar todos los registros, pero es algo tan íntimamente ligado a la base de datos que por eso pensaba que no me "salía" del tema.

Saludos

Cita:
Iniciado por gnzsoloyo Ver Mensaje
@jc_moj, esa es una solución por programación, tema que si te fijas en las reglas del foro de BBDD, es OFF TOPIC.
De todos modos, la primera parte de la soución propuesta se trata de crear programáticament lo mismo que le planteo en la primera solución. Ese sería el método usual para manejarlo en muchos lenguajes. El problema de la lentitud, según dice en su contestación, sigue sin resolverse de ese modo.

Ahora bien, si @ico87 quiere una solución por programación, tendré que mover el post a otro foro, porque ya no se trataría de una solución por BBDD.

Por favor, lee las reglas que cada subforo tiene para si mismo.
  #8 (permalink)  
Antiguo 18/06/2014, 15:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problemas de tiempo al insertar con sqlite

La verdad es que hasta hace un largo tiempo,SQLite no manejaba bien las transacciones. No se ahora, porque hace bastante que no lo intento.
En todo caso, veremos que dice el autor del thread.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 19/06/2014, 16:52
 
Fecha de Ingreso: mayo-2013
Mensajes: 28
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Problemas de tiempo al insertar con sqlite

Buenas

Esas librerias son para Android... y mi aplicacion es de escritorio... :(
El resto de soluciones propuestas no han mejorado la inserción.

Gracias de todos modos.
  #10 (permalink)  
Antiguo 19/06/2014, 17:02
 
Fecha de Ingreso: mayo-2013
Mensajes: 28
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Problemas de tiempo al insertar con sqlite

Pues lo he arreglado al final con un arreglo de programación, si os parece lo explico y pasais este post al subforo de programacion.

Al final el problema como comentabais es de transacciones, aunque se use el addBatch() parece que crea una transaccion por cada insert, la forma de ejecutar todo en una sola transacción es hacer un setCommit(false) y hacer un commit() al final de las insercciones.

La explicación en mas profundidad aqui:
[URL="http://www.mkyong.com/jdbc/jdbc-transaction-example/"]http://www.mkyong.com/jdbc/jdbc-transaction-example/[/URL]

Gracias por vuestra ayuda y espero que esto ayude a alguien.
Saludos
  #11 (permalink)  
Antiguo 20/06/2014, 07:16
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problemas de tiempo al insertar con sqlite

Cita:
Iniciado por ico87 Ver Mensaje
Buenas

Esas librerias son para Android... y mi aplicacion es de escritorio... :(
El resto de soluciones propuestas no han mejorado la inserción.

Gracias de todos modos.
sqllite para escritorio???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 20/06/2014, 07:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problemas de tiempo al insertar con sqlite

Raro, pero no demasiado.
En una emprsa donde trabajé lo usaban para muchas aplicaciones mínimas de escritorio. No lo veo extraño, desde el momento en que es soportado para VB.Net 2003 en adelante.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 20/06/2014, 11:25
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 137
Antigüedad: 14 años, 7 meses
Puntos: 12
Respuesta: Problemas de tiempo al insertar con sqlite

Hola

Cita:
Iniciado por Libras Ver Mensaje
sqllite para escritorio???
Yo lo uso para programas que van a manejar una base de datos no muy grande y funciona perfectamente bien.

Poca instalación y configuración, fácil y rápido

Saludos
  #14 (permalink)  
Antiguo 20/06/2014, 12:31
 
Fecha de Ingreso: mayo-2013
Mensajes: 28
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Problemas de tiempo al insertar con sqlite

Mi aplicacion mueve una base de datos mas grande que pequeña, me la recomendaron despues de tener mil problemas con derby y alguna mas parecida, y estoy super contento!!

Notar que yo lo que neceito es una base de datos embebida (local) que no requiera de instalar un servidor como tomcat.

Etiquetas: campos, siguiente, sqlite, tabla, tiempo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:27.