“Which ORM method is the fastest?”
search() or search_read()?
browse() or read()?
Maybe sudo() makes it faster?
👉 The truth:
There is no “fast ORM method.”
There are only fast patterns and dangerous ones.
And one bad pattern can silently destroy your project’s performance.
❌ The Mistake: Repeating ORM Calls in Loops
This is a very common anti-pattern:
for partner in partners: self.env['sale.order'].search([ ('partner_id', '=', partner.id) ])
What’s wrong here?
- One database query per partner
- 100 partners = 100 SQL queries
- 1,000 partners = performance nightmare
This is how small customizations turn into slow systems, angry users, and “Odoo is slow” complaints.
✅ The Fix: Think in Sets, Not Rows
The correct pattern:
self.env['sale.order'].search([ ('partner_id', 'in', partners.ids) ])
Why this is fast:
- ✅ Single SQL query
- ✅ PostgreSQL does the heavy lifting
- ✅ Minimal ORM overhead
- ✅ Scales cleanly as data grows
Same result.
Massive performance difference.
ORM Performance Rules Every Odoo Developer Must Follow
✔ Use browse() When You Already Have IDs
If you already know the record IDs, don’t search again.
records = self.env['model'].browse(ids)
Searching again wastes time and database resources.
✔ Let PostgreSQL Filter Data, Not Python
Bad idea:
records = self.env['sale.order'].search([]) records = records.filtered(lambda r: r.state == 'sale')
Better:
records = self.env['sale.order'].search([ ('state', '=', 'sale') ])
👉 Databases are built to filter data.
👉 Python loops are not.
✔ Avoid Unnecessary sudo()
Using sudo() everywhere:
- Bypasses record rules
- Increases risk
- Can load more data than needed
Use it only when required, not as a habit.
Odoo performance problems are rarely about:
- ORM being slow
- PostgreSQL being weak
- Server configuration (at first)
They are usually about Wrong ORM patterns
Think in:
- Batches, not loops
- Sets, not single records
- Queries, not Python filtering
Good Odoo code doesn’t just work — it scales.
If your code works only with 100 records but breaks at 100,000,
it’s not production-ready.
Write once.
Write smart.
Let Odoo and PostgreSQL do what they’re good at. 💪