From 7f29b31cf307e640806225440be69561f9eea0b2 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 20 Aug 2018 17:35:09 +0200 Subject: [PATCH] [IMP] models: use raw sql for modified() Avoiding search makes modified go from 18% of total runtime to 9% over 10k calls (though only 5k search() call). --- odoo/models.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/odoo/models.py b/odoo/models.py index 0ca056286dc..66fc08fdff5 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -5108,9 +5108,16 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): if path == 'id': target0 = self else: - env = self.env(user=SUPERUSER_ID, context={'active_test': False}) - target0 = env[model_name].search([(path, 'in', self.ids)]) - target0 = target0.with_env(self.env) + Model = self.env[model_name] + f = Model._fields.get(path) + if f and f.store and f.type not in ('one2many', 'many2many'): + # path is direct (not dotted), stored, and inline -> optimise to raw sql + self.env.cr.execute("SELECT id FROM %s WHERE %s in %%s" % (Model._table, path), [tuple(self.ids)]) + target0 = Model.browse(i for [i] in self.env.cr.fetchall()) + else: + env = self.env(user=SUPERUSER_ID, context={'active_test': False}) + target0 = env[model_name].search([(path, 'in', self.ids)]) + target0 = target0.with_env(self.env) # prepare recomputation for each field on linked records for field in stored: # discard records to not recompute for field