¿Cómo optimizar transacciones grandes?

Cuidado con el TRN

El servidor de Velneo realiza un gestión segura de las transacciones que procesa. En ese proceso guarda las operaciones en el fichero con extensión ".trn" que se encuentra en el subdirectorio "trn" del servidor.

En ese fichero se van añadiendo las operaciones de las transacciones en curso, en el momento en que no hay ninguna transacción activa el servidor se encarga de eliminar este fichero. Por ese motivo lo más habitual es que cuando miras ese directorio o no hay ningún fichero o existe un fichero de pequeño tamaño.

Esa misma información también se genera en memoria, de esta forma el servidor es más ágil, pero debemos tener en cuenta que la memoria que consume la ejecución de un proceso tiene relación con el tamaño en disco de la transacción. Si es grande, también será grande el consumo de memoria.

Si ejecutamos un transacción muy larga lo que conseguimos es que este fichero crezca mucho de tamaño y que el resto de transacciones finalizadas no se puedan limpiar.

Como cualquier fichero del sistema, cuando mayor sea su tamaño peor rendimiento tendrá su gestión a la hora de añadir nuevo contenido.

Divide y vencerás

La solución para optimizar las grandes transacciones es dividirlas en transacciones más pequeñas.

Debemos buscar el punto óptimo de ejecución, es decir, si una única transacción grande se acaba volviendo muy lenta porque puede saturar la memoria del servidor, millones de transacciones de una operación también es una mala solución.

Hay que tener en cuenta que abrir y cerrar una transacción requiere tiempo al servidor, por ese motivo debemos intentar que en cada transacción se realicen varios miles de operaciones. Otro aspecto a tener en cuenta en el crecimiento del fichero ".trn" es el tamaño de los registros que estamos transaccionando, ya que ocupan más 1.000 operaciones de una tabla de 1.000 bytes de tamaño registro que 10.000 operaciones de un tamaño de registro de 40 bytes.

Por ejemplo, procesar una transacción de 1.000.000 de operaciones puede ser interesante dividirla en 50 transacción de 20.000 registros.

Las cestas nos ayudan

En muchas ocasiones las transacciones se realizan sobre una lista de miles o millones de registros a procesar. En esos casos podemos meter en una cesta todos los registros a procesar e ir cortando bloques de registros que pasaremos al proceso en 3º plano para que los procese. Y así, sucesivamente hasta terminar con todos los registros.

Veamos un pequeño ejemplo: se trata de un proceso de lista en el que, mediante cestas, iremos procesando la lista de 50 en 50 registros. Aclara que este número de registros a procesar ha sido establecido al azar, dependerá del tamaño de las transacciones el número óptimo a procesar en cada caso.

Rem ( Inicializamos cestas )
Cesta: Crear cesta local ( MAESTROS@miapp dat, maestros base )
Cesta: Crear cesta local ( MAESTROS@miapp dat, maestros auxiliar )
Libre
Rem ( Añadimos los registros a la cesta base )
Cargar lista ( MAESTROS@miapp dat, ID, , , ,  )
    Cesta: Agregar lista a la cesta ( maestros base )
Libre
Rem ( Procesamos la cesta base de 50 en 50 registros )
Set ( FIN_CESTA, 0 )
For ( X, 0, !FIN_CESTA, 1 )
    Rem ( Si la cesta base tiene fichas, las replicamos en la cesta auxiliar y la procesamos )
    Cesta: Procesar ( maestros base )
        If ( sysListSize )
            Cesta: Agregar lista a la cesta ( maestros auxiliar )
        Else
            Set ( FIN_CESTA, 1 )
    Rem ( Procesamos la cesta auxiliar )
    If ( !FIN_CESTA )
        Cesta: Procesar ( maestros auxiliar )
            Rem ( Dejamos solo los 50 primeros registros de la cesta auxiliar )
            Cortar lista ( 50, 1 )
            Rem ( Aquí ejecutar proceso tranaccional de lista )
            Ejecutar proceso ( PROCESAR_LISTA@miapp app, 3º plano: Servidor (síncrono), , ,  )
                Libre
            Rem ( Quitamos de la cesta base los procesados en la cesta auxiliar )
            Cesta: Quitar lista de la cesta ( maestros base )
        Rem ( Limpiamos la cesta base )
        Cesta: Limpiar ( maestros auxiliar )

Última actualización