Mejorando la performance agrupando las operaciones de borrado

10 de setiembre de 2025 por
Gustavo Orrillo
| Sin comentarios aún
 

Un pequeño tip que aprendí ayer. El problema que tenía era que debía mejorar la performance previa a la validación de transferencias de stock. Y tenía miles de operaciones (stock.move.line) que debía eliminar. Concretamente 2000. Y las procesaba de a una, de la siguiente manera:

move_lines = self.env['stock.move.line'].search([('picking_id','=',self.id)])
for move_line in move_lines:
move_line.unlink()


Lo cual llevaba su tiempo en procesar. Para ser mas exactos, practicamente un segundo cada unlink lo que hacía que procesar toda la operación llevase más de 20 minutos. 

Cambié la operación agrupando las operaciones de unlink de la siguiente manera:

move_lines = self.env['stock.move.line'].search([('picking_id','=',self.id)])
move_lines.unlink()

Y fue otro cantar, menos de un minuto tardo procesando todos los unlinks y la validación que tardaba decenas de minutos, paso a tardar dos o tres minutos.

Creo que el gran cambio tiene que ver con el hecho que el ORM esta optimizado para procesar registros agrupados y aplicar las reglas del ORM una sola vez. Por otra parte, Odoo ejecuta una sola operación de SQL en lugar de miles de operaciones de SQL. Eso tambien ayuda.

Bueno, quería comentarles algo que aprendí ayer que les puede resultar de utilidad algún día.

Gustavo Orrillo 10 de setiembre de 2025
Compartir
Categorías
Archivar
Identificarse dejar un comentario