Ir al contenido

Prefetching en Odoo: el mismo motor, y el hábito que lo rompe

22 de junio de 2026 por
Esteban
Un reporte que antes tardaba dos segundos empezó a tardar cuarenta. El código no
había cambiado casi nada: alguien metió un .sudo() dentro de un bucle. Ese
pequeño detalle apagó el prefetching del ORM y convirtió una sola consulta en
miles. 

Qué hace el prefetching


Cuando lees un campo de un registro, Odoo no lee solo ese campo de ese registro:
lee ese campo (y los demás campos simples) de todo el recordset de una vez, y
lo guarda en caché. El ejemplo de la documentación lo deja claro: con un
recordset de 1000 partners, leer dos campos en un bucle daría 2000 consultas sin

prefetching; con prefetching, da una sola.

partners = env['res.partner'].search([]) # 1000 registros


for partner in partners:

print(partner.name) # 1ro: trae 'name' (y demás) de los 1000 ​ print(partner.lang) # ya está en caché, no consulta ​



No tienes que activar nada. El prefetching ya está ahí siempre que recorras el
recordset normalmente. El problema es romperlo sin darte cuenta.

El hábito que lo rompe

El prefetching vive en la **caché del entorno** (`env`). Cuando llamas `.sudo()`,
Odoo te devuelve el registro en un **entorno nuevo**, y ese entorno nuevo no
hereda la caché del anterior. Dentro de un bucle, eso significa una consulta por
vuelta:

for partner in partners: 
name = partner.sudo().name # cada .sudo() = nueva consulta
Mil registros, mil consultas. El prefetching no falló; lo apagaste tú al pedir un
entorno fresco en cada iteración.

El arreglo es mover el .sudo() fuera del bucle, una sola vez, para que todas
las lecturas compartan el mismo entorno y la misma caché:

for partner in partners.sudo(): # un solo entorno con sudo

name = partner.name # vuelve el prefetching: una consulta

Misma intención, mismo `sudo`, pero ahora se hace una vez sobre todo el recordset
en lugar de mil veces sobre cada registro.

Para recordar

  • El prefetching está activo por defecto: recorrer un recordset lee todos los campos simples en una consulta.
  • .sudo(), with_context() y otros cambios de entorno crean una caché nueva.
  •   Hazlos una vez sobre el recordset, nunca por registro dentro del bucle.
  • En Odoo 18 y 19 el mecanismo es el mismo, así que la regla viaja entre versiones.

Referencias

en Odoo