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.