Odoo slowness comes from under-sized PostgreSQL resources, missing indexes, long-running cron jobs, unoptimized list views with heavy domains, and custom SQL in loops. Enable profiling, tune worker and memory limits, archive old data, add database indexes on frequent search fields, optimize scheduled actions, and cache static assets behind CDN on Odoo.sh or reverse proxy.
Steps
- Check server metrics: CPU, RAM, PostgreSQL connections, and disk I/O on hosting.
- Enable log_level warn and use Odoo profiler or speedscope on slow requests.
- Review ir.cron jobs for tight intervals and heavy ORM searches.
- Limit default list view fields; avoid x2many without limits on form views.
- Add pg indexes on custom fields used in domains on large tables.
- Increase workers thoughtfully; align PostgreSQL max_connections and shared_buffers.
- Purge or archive mail.message and stock.move history beyond retention policy.
Common mistakes
- Adding workers without RAM causing swap thrashing.
- Custom module search() in onchange hitting millions of rows.
- Running inventory valuation report at peak shipping hours.
- Disabling asset minification in production debug mode.
- Never running VACUUM ANALYZE on PostgreSQL after bulk imports.
Odoo version notes
Performance tuning applies to Community and Enterprise 16–18 on Odoo.sh and on-prem. Odoo 17 asset bundles differ—clear CDN cache after upgrade. Enterprise does not auto-scale; monitor long SQL in pg_stat_statements. Odoo Autopilot-style care includes monthly health reports catching cron and error spikes.
When to bring in help
If the fix touches custom modules, regulated traceability, or production outages, a focused rescue sprint beats months of trial and error. See our Odoo service.