Borrado de registros - Transacción superior a 64000 operaciones


([N4] rpaton) #1

Hola:

 Estoy importando ficheros de texto con más de 100.000 registros y para evitar que el número de operaciones por transacción supere las 64000 y se aborte en un proceso hago una llamada a una función que se encarga de grabar cada línea. Con la importación todo perfecto, pero si quiero borrar los registros importados, ¿cómo puedo implementar algo para el borrado sin que se generen transacciones de más de 64000 operaciones?. He probado con "Cargar Lista" y "Recorrer lista eliminando ficha" pero se aborta al llegar a 64000 operaciones.

 Saludos.
 Ricardo Patón

([N4] velavisual) #2

@rpaton

Creo que debes empezar por crear/eliminar los registros en bloques de 10.000 por transacción.

Creas un bucle del número de transacciones a realizar (totalregistros/10.000) y el resto para la transacción final.

Haz pruebas y observa el vAdmin.


([N4] velavisual) #3

@rpaton

Ampliar que he realizado una prueba de eliminación de todos los registros de una tabla (125000 previamente dados de alta mediante bucle) y no se ha desecho la transacción.

No lo he realizado de la forma que te he comentado anteriormente, sólo un bucle para las altas y un recorrer lista eliminando fichas para las bajas.

Los procesos son llamados y ejecutados en tercer plano que es donde tengo puesto los procesos, en el proyecto de datos.


([N1] wikan) #4

Yo he echo transacciones de mas de 3 millones de operaciones y sin problemas. Deberías revisar si estás intentando crear claves duplicadas, error en los datos a importar, etc, etc.

Haciendo lo que te comenta @velavisual, podrías incluso localizar de manera más fácil el bloque de registros que te falla.


([N4] rpaton) #5

Hola:
Muchas gracias por responder.
Recorriendo la lista eliminando fichas me suben tanto las operaciones por que tengo índices creados y por cada uno de ellos genera una operación en la transacción además de la del propio registro a borrar.
Quiero dejar implementada esta opción y por tanto no puedo borrar los índices y luego crearlos.
Adjunto imagen del proceso de eliminación con Bucle como comenta Antonio Vela. No sé si es correcto pero no me funciona. Tenéis algún ejemplo en caso de que fuera incorrecto.

Saludos.

Ricardo Patón



([N4] velavisual) #6

@rpaton

El proceso que adjuntas no sigue el procedimiento que pretendía explicarte (tal vez no me expliqué bién) pero de todas formas creo que tu problema puede ser generado por otras causas.

Para eliminar la tabla te basta con cargar lista y recorrer la lista eliminando fichas. Siempre ejecutado en tercer plano.


([N4] rpaton) #7

Hola Antonio:
Si me funciona lo de Cargar lista y Recorrer lista eliminando fichas, pero el problema surge al llegar la transacción a 64000 operaciones y llego cuando he borrado 3000 registros ya que en el proceso de borrado se tiene en cuenta como operación la modificación de cada índice.

Yo lo que busco es algo que me pueda lanzar una transacción por registro borrado y no como hace Cargar lista y recorrer lista que las junta en una misma transacción y a la fuerza puedo llegar al tope de las 64000 operaciones, por ese mostré lo del bucle hasta fin de lista cargando lista y seleccionando el primero y borrando el seleccionado, pero no se si eso es bueno o malo hacerlo.

Saludos.

Ricardo Patón


([N4] juan.pescapuerta) #8

Buenas.

Fíjate si cuando borrar la memoria del valiente supera los 2gb

Saludos


([N2] AyudaVelneo) #9

Hola Ricardo:

Comprueba si tienes un trigger anterior o posterior a la baja de la ficha en la tabla que estas eliminando los registros…

Si lo tienes mira el proceso por si fuese por aquí el problema de las transacciones.

Un saludo


([N4] rpaton) #10

Hola Francisco:
No tengo trigger anterior ni posterior a la baja de la ficha.
Si ejecuto un Proceso en el que lanzo un Bucle desde 1 hasta SysListSize y dentro de este Bucle llamo a una Función que “Selecciona la ficha por la posición 1” y la elimina observo en el vAdmin se genera una transacción por registro, por lo que nunca alcanzaría transacciones mayores de 64000 que es lo que quiero. Pero, siempre hay un pero, una vez que el bucle llega a SysListSize no sale de él. Ver imagen de proceso y función que he utilizado para la prueba. ¿Qué estaré haciendo mal?

Saludos.

Ricardo Patón



([N4] mperez) #11

Si lo que quieres es esto
“Yo lo que busco es algo que me pueda lanzar una transacción por registro borrado y no como hace Cargar lista y recorrer lista que las junta en una misma transacción …”

Ni una cosa ni al otra, no creo que debas hacer una transacción por registro, pero existe el punto intermedio.

Basta que uses dos procesos, una que recorre o carga la lista completa y que no trasnsacciona y que lance a su vez otro proceso que carga trozos y que si transacciona

Por ejemplo (Hay mil maneras de hacerlo)

Proceso 1: Carga lista de clientes, multiparte esa lista por provincias, ejecuta proceso 2

Proceso 2 : Recorre la lista eliminando registros y lo ejecutara por cada parte de la lista generada

De esta manera te hará una transaccion por todos los registros de cliente de cada provincia.

Esto es un ejemplo pero lo peudes hacer por números de registros haciendo bloques de 50.000 en 50.000 y por orden, etc. Tan solo se tarta de dividir el proceso en dos, de manera que el segundo que transacciona lo haga por tramos


([N4] rpaton) #12

Hola Miguel:
Efectivamente como la idea que me indicas del Multipartir me funciona ya que separo los registros a borrar por tienda (cada cliente pertenece a una tienda). De esa forma hace 100 transacciones y el número de operaciones no llega a las 64000 de tope.
Únicamente he observado que los ficheros CLIENTES.DAT y CLIENTES.IDX después de haber borrado los registros con estos procesos no disminuyen de tamaño. ¿Es eso normal?

Saludos.

Ricardo Patón


([N4] rpaton) #13

Adjunto imagen con el proceso del mensaje anterior



([N1] wikan) #14

Buenas, es normal que no dismuniya. Ya que los espacios quedan reservados para nuevas altas.
Podías lanzar en manejador de objetos en tercer plano y ganarías bastante velocidad.


([N4] rpaton) #15

Buenos Días:
Gracias a todos por vuestros comentarios. Conseguí lo que quería y aclaré las dudas que me habían surgido.
En resumen, para borrar los registros masivamente SI funciona perfectamente “Cargar Lista” y “Recorrer Lista Eliminando Registros” como indicó Antonio Vela aunque el número de transacciones supere las 64000 ya que la eliminación de registros la realiza. Lo que me confundió fue que el tamaño de los ficheros .DAT y .IDX no disminuyeran pero quedó claro con el apunte de Manuel ya que luego intenté añadir un nuevo campo al fichero de clientes y al reconstruirse la nueva estructura el tamaño de los ficheros se redujo.
Lo de multipartir también funciona y evitas el tema del tope de 64000 operaciones por transacción.
Según he visto en la documentación de las Transacciones el tope de 64000 es en la información que se refleja en vAdmin, pero que la transacción se completa.

Saludos.

Ricardo Patón