¿Hay alguna forma de realizar inserciones rápidas?

23 views
Skip to first unread message

mfdezp

unread,
Dec 7, 2017, 3:45:42 AM12/7/17
to Eneboo
Me explico:

Necesito crear una tabla "Buffer" al estilo "co_i_balancesit_buffer", pero graba muchas filas, y tarda demasiado.

He descubierto que hay un método que se llama quickSqlSelect y otro que se llama quickSqlDelete, que se salta el método transaccional, con lo que van mucho mas rápidos.

¿Hay algo parecido o se puede hacer una inserción en una tabla "Buffer" de forma más rápida?

Si no existe, ¿hay alguna forma de anular la transacción?

Gracias.

José Antonio Fernández Fernández

unread,
Dec 7, 2017, 4:49:58 AM12/7/17
to ene...@googlegroups.com
en util hay una funcion que ejecuta sqls directos , sin usar un cursor para ello. la función es execSql(sql , conname), en conname creo q puedes usar "default" o rl nombre de la conexión remota que uses, si es el caso, los dos campos son obligatorios. Saludos

--
Has recibido este mensaje porque estás suscrito al grupo "Eneboo" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a eneboo+unsubscribe@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

deavid

unread,
Dec 7, 2017, 5:14:18 AM12/7/17
to ene...@googlegroups.com

Y si además de lo que dice aulla, pasas un "insert into select" la velocidad es de casi millón de registros por segundo.
Si necesitas precalcular en Eneboo todo, puedes almacenar 100 registros en memoria y lanzar un insert con múltiples filas (pero creo que tiene distintas sintaxis dependiendo de si es mysql o postgresql)


Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a eneboo+un...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
Has recibido este mensaje porque estás suscrito al grupo "Eneboo" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a eneboo+un...@googlegroups.com.

mfdezp

unread,
Dec 7, 2017, 12:00:26 PM12/7/17
to Eneboo
De entrada, Gracias a los dos.

He intentado la forma de Aulla, y resulta que es mas lento que el proceso con cursor apuntando a la Tabla y commitBuffer().

Con commitBuffer el proceso tarda de media 3:35 y con el execSql directo, 5:05.

Os digo lo que hago

Creo unas variables, que coinciden con las columnas de la tabla.

Para cada artículo, calculo los valores y los guardo en esas variables. Antes lo hacía contra la columna de la tabla Buffer.

Al final, creo la sentencia SQL, con los valores de las variables.

Estoy haciendo algo mal?

Os adjunto el codigo del execSql:

var cadenaSql : String;
cadenaSql = 'INSERT INTO i_estadisticas_articulos_buffer ('
+'idestaciontrabajo,referencia,codfamilia,codsubfamilia,stockt,stocka,unidadesvendidast,unidadesvendidasa,importevendidot,importevendidoa,importecostovendidot,'
+'importecostovendidoa,unidadescompradast,unidadescompradasa,importecompradot,importecompradoa,unidadestraspasadas,unidadesfabricadas,unidadesregularizadas'
+') VALUES ('
+ "'" + buffer_idestaciontrabajo + "',"
+ "'" + buffer_referencia + "',"
+ "'" + buffer_codfamilia + "',"
+ "'" + buffer_codsubfamilia + "',"
+ buffer_stockt + ","
+ buffer_stocka + ","
+ buffer_unidadesvendidast + ","
+ buffer_unidadesvendidasa + ","
+ buffer_importevendidot + ","
+ buffer_importevendidoa + ","
+ buffer_importecostovendidot + ","
+ buffer_importecostovendidoa + ","
+ buffer_unidadescompradast + ","
+ buffer_unidadescompradasa + ","
+ buffer_importecompradot + ","
+ buffer_importecompradoa + ","
+ buffer_unidadestraspasadas + ","
+ buffer_unidadesfabricadas + ","
+ buffer_unidadesregularizadas    
+')';
util.execSql(cadenaSql, "default");

Gracias de nuevo..

deavid

unread,
Dec 7, 2017, 1:29:09 PM12/7/17
to ene...@googlegroups.com
Lanzar los comandos uno a uno no va a hacer que sea más rápido. Como mucho te saltas los afterCommits y los checkIntegrity (cosa que también puedes hacer con commitBuffer). Y tienes penalización porque la transformación de variable a texto la haces en QSA.

Tienes que conseguir empaquetar varias filas en una única query SQL o conseguir que SQL haga parte de los cálculos que tú estás haciendo.

Si estás usando PostgreSQL también puedes escribir una función PlPgsql que haga lo que haces tú, y llamarla directamente.

Para optimizar no hay una receta mágica que funcione, hay que entender cómo funciona la base de datos, sacar un análisis de dónde se invierte el tiempo y pensar en organizar la operación de modo que realice el mínimo trabajo posible.



--
Reply all
Reply to author
Forward
0 new messages