[FIX] *: query counts

Adapt some query counts to their optimal value, in order to measure the
effect of the following commits on queries.

In module test_performance, some query counts were actually not correct:
the initial flush() done by the context manager assertQueryCount() may
prefetch some data to the cache, and that prefetching is not accounted
for in the query count.  This is very true when assertQueryCount() is
preceded by a cache invalidation.  We have to move the invalidation
inside the context manager, so that the prefetching is now counted.
This commit is contained in:
Raphael Collet
2021-02-22 16:15:28 +00:00
parent 371ae55a19
commit 75d2f995e2
5 changed files with 52 additions and 51 deletions
@@ -313,8 +313,7 @@ class TestCompanyLeave(TransactionCase):
})
company_leave._compute_date_from_to()
count = 865
with self.assertQueryCount(__system__=count, admin=count):
with self.assertQueryCount(__system__=735, admin=865):
# Original query count: 1987
# Without tracking/activity context keys: 5154
company_leave.action_validate()
+2 -2
View File
@@ -281,7 +281,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
test_record = self.env['mail.test.ticket'].browse(self.test_record_full.id)
test_template = self.env['mail.template'].browse(self.test_template_full.id)
# TODO FIXME non deterministic, last check 25 Mar 2020. Runbot at most +7 compared to local.
with self.assertQueryCount(__system__=12, emp=14):
with self.assertQueryCount(__system__=11, emp=13):
composer = self.env['mail.compose.message'].with_context({
'default_composition_mode': 'comment',
'default_model': test_record._name,
@@ -602,7 +602,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
customer_id = self.customer.id
user_id = self.user_portal.id
with self.assertQueryCount(__system__=109, emp=110):
with self.assertQueryCount(__system__=108, emp=109):
rec = self.env['mail.test.ticket'].create({
'name': 'Test',
'container_id': container_id,
@@ -91,7 +91,7 @@ class TestMassMailBlPerformance(TestMassMailPerformanceBase):
})
# runbot needs +62 compared to local
with self.assertQueryCount(__system__=1993, marketing=1994):
with self.assertQueryCount(__system__=1992, marketing=1993):
mailing.action_send_mail()
self.assertEqual(mailing.sent, 50)
+2 -2
View File
@@ -510,8 +510,8 @@ class TestCustomFields(common.TransactionCase):
})
query_count = self.cr.sql_log_count - query_count
# create the related field, and assert it only takes 3 extra queries
with self.assertQueryCount(query_count + 3):
# create the related field, and assert it only takes 1 extra query
with self.assertQueryCount(query_count + 1):
self.env['ir.model.fields'].create({
'model_id': self.env['ir.model']._get_id('res.partner'),
'name': 'x_oh_boy',
@@ -112,37 +112,37 @@ class TestPerformance(SavepointCaseWithUserDemo):
rec1 = self.env['test_performance.base'].create({'name': 'X'})
# create N lines on rec1: O(N) queries
rec1.invalidate_cache()
with self.assertQueryCount(2):
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec1.write({'line_ids': [Command.create({'value': 0})]})
self.assertEqual(len(rec1.line_ids), 1)
rec1.invalidate_cache()
with self.assertQueryCount(15):
rec1.invalidate_cache()
rec1.write({'line_ids': [Command.create({'value': val}) for val in range(1, 12)]})
self.assertEqual(len(rec1.line_ids), 12)
lines = rec1.line_ids
# update N lines: O(N) queries
rec1.invalidate_cache()
with self.assertQueryCount(6):
rec1.invalidate_cache()
rec1.write({'line_ids': [Command.update(line.id, {'value': 42}) for line in lines[0]]})
self.assertEqual(rec1.line_ids, lines)
rec1.invalidate_cache()
with self.assertQueryCount(26):
rec1.invalidate_cache()
rec1.write({'line_ids': [Command.update(line.id, {'value': 42 + line.id}) for line in lines[1:]]})
self.assertEqual(rec1.line_ids, lines)
# delete N lines: O(1) queries
rec1.invalidate_cache()
with self.assertQueryCount(__system__=14, demo=14):
with self.assertQueryCount(14):
rec1.invalidate_cache()
rec1.write({'line_ids': [Command.delete(line.id) for line in lines[0]]})
self.assertEqual(rec1.line_ids, lines[1:])
rec1.invalidate_cache()
with self.assertQueryCount(__system__=12, demo=12):
with self.assertQueryCount(12):
rec1.invalidate_cache()
rec1.write({'line_ids': [Command.delete(line.id) for line in lines[1:]]})
self.assertFalse(rec1.line_ids)
self.assertFalse(lines.exists())
@@ -151,13 +151,13 @@ class TestPerformance(SavepointCaseWithUserDemo):
lines = rec1.line_ids
# unlink N lines: O(1) queries
rec1.invalidate_cache()
with self.assertQueryCount(__system__=11, demo=11):
with self.assertQueryCount(14):
rec1.invalidate_cache()
rec1.write({'line_ids': [Command.unlink(line.id) for line in lines[0]]})
self.assertEqual(rec1.line_ids, lines[1:])
rec1.invalidate_cache()
with self.assertQueryCount(__system__=12, demo=12):
with self.assertQueryCount(12):
rec1.invalidate_cache()
rec1.write({'line_ids': [Command.unlink(line.id) for line in lines[1:]]})
self.assertFalse(rec1.line_ids)
self.assertFalse(lines.exists())
@@ -167,36 +167,36 @@ class TestPerformance(SavepointCaseWithUserDemo):
rec2 = self.env['test_performance.base'].create({'name': 'X'})
# link N lines from rec1 to rec2: O(1) queries
rec1.invalidate_cache()
with self.assertQueryCount(2):
with self.assertQueryCount(7):
rec1.invalidate_cache()
rec2.write({'line_ids': [Command.link(line.id) for line in lines[0]]})
self.assertEqual(rec1.line_ids, lines[1:])
self.assertEqual(rec2.line_ids, lines[0])
rec1.invalidate_cache()
with self.assertQueryCount(7):
rec1.invalidate_cache()
rec2.write({'line_ids': [Command.link(line.id) for line in lines[1:]]})
self.assertFalse(rec1.line_ids)
self.assertEqual(rec2.line_ids, lines)
rec1.invalidate_cache()
with self.assertQueryCount(5):
rec1.invalidate_cache()
rec2.write({'line_ids': [Command.link(line.id) for line in lines[0]]})
self.assertEqual(rec2.line_ids, lines)
rec1.invalidate_cache()
with self.assertQueryCount(5):
rec1.invalidate_cache()
rec2.write({'line_ids': [Command.link(line.id) for line in lines[1:]]})
self.assertEqual(rec2.line_ids, lines)
# empty N lines in rec2: O(1) queries
rec1.invalidate_cache()
with self.assertQueryCount(__system__=13, demo=13):
rec1.invalidate_cache()
rec2.write({'line_ids': [Command.clear()]})
self.assertFalse(rec2.line_ids)
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec2.write({'line_ids': [Command.clear()]})
self.assertFalse(rec2.line_ids)
@@ -204,18 +204,20 @@ class TestPerformance(SavepointCaseWithUserDemo):
lines = rec1.line_ids
# set N lines in rec2: O(1) queries
rec1.invalidate_cache()
with self.assertQueryCount(4):
with self.assertQueryCount(8):
rec1.invalidate_cache()
rec2.write({'line_ids': [Command.set(lines[0].ids)]})
self.assertEqual(rec1.line_ids, lines[1:])
self.assertEqual(rec2.line_ids, lines[0])
with self.assertQueryCount(5):
with self.assertQueryCount(7):
rec1.invalidate_cache()
rec2.write({'line_ids': [Command.set(lines.ids)]})
self.assertFalse(rec1.line_ids)
self.assertEqual(rec2.line_ids, lines)
with self.assertQueryCount(3):
with self.assertQueryCount(5):
rec1.invalidate_cache()
rec2.write({'line_ids': [Command.set(lines.ids)]})
self.assertEqual(rec2.line_ids, lines)
@@ -238,37 +240,37 @@ class TestPerformance(SavepointCaseWithUserDemo):
rec1 = self.env['test_performance.base'].create({'name': 'X'})
# create N tags on rec1: O(N) queries
rec1.invalidate_cache()
with self.assertQueryCount(4):
rec1.invalidate_cache()
rec1.write({'tag_ids': [Command.create({'name': 0})]})
self.assertEqual(len(rec1.tag_ids), 1)
rec1.invalidate_cache()
with self.assertQueryCount(14):
rec1.invalidate_cache()
rec1.write({'tag_ids': [Command.create({'name': val}) for val in range(1, 12)]})
self.assertEqual(len(rec1.tag_ids), 12)
tags = rec1.tag_ids
# update N tags: O(N) queries
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec1.write({'tag_ids': [Command.update(tag.id, {'name': 'X'}) for tag in tags[0]]})
self.assertEqual(rec1.tag_ids, tags)
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec1.write({'tag_ids': [Command.update(tag.id, {'name': 'X'}) for tag in tags[1:]]})
self.assertEqual(rec1.tag_ids, tags)
# delete N tags: O(1) queries
rec1.invalidate_cache()
with self.assertQueryCount(__system__=8, demo=8):
rec1.invalidate_cache()
rec1.write({'tag_ids': [Command.delete(tag.id) for tag in tags[0]]})
self.assertEqual(rec1.tag_ids, tags[1:])
rec1.invalidate_cache()
with self.assertQueryCount(__system__=8, demo=8):
rec1.invalidate_cache()
rec1.write({'tag_ids': [Command.delete(tag.id) for tag in tags[1:]]})
self.assertFalse(rec1.tag_ids)
self.assertFalse(tags.exists())
@@ -277,13 +279,13 @@ class TestPerformance(SavepointCaseWithUserDemo):
tags = rec1.tag_ids
# unlink N tags: O(1) queries
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec1.write({'tag_ids': [Command.unlink(tag.id) for tag in tags[0]]})
self.assertEqual(rec1.tag_ids, tags[1:])
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec1.write({'tag_ids': [Command.unlink(tag.id) for tag in tags[1:]]})
self.assertFalse(rec1.tag_ids)
self.assertTrue(tags.exists())
@@ -291,56 +293,56 @@ class TestPerformance(SavepointCaseWithUserDemo):
rec2 = self.env['test_performance.base'].create({'name': 'X'})
# link N tags from rec1 to rec2: O(1) queries
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[0]]})
self.assertEqual(rec2.tag_ids, tags[0])
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[1:]]})
self.assertEqual(rec2.tag_ids, tags)
rec1.invalidate_cache()
with self.assertQueryCount(2):
rec1.invalidate_cache()
rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[1:]]})
self.assertEqual(rec2.tag_ids, tags)
# empty N tags in rec2: O(1) queries
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec2.write({'tag_ids': [Command.clear()]})
self.assertFalse(rec2.tag_ids)
self.assertTrue(tags.exists())
rec1.invalidate_cache()
with self.assertQueryCount(2):
rec1.invalidate_cache()
rec2.write({'tag_ids': [Command.clear()]})
self.assertFalse(rec2.tag_ids)
# set N tags in rec2: O(1) queries
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec2.write({'tag_ids': [Command.set(tags.ids)]})
self.assertEqual(rec2.tag_ids, tags)
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec2.write({'tag_ids': [Command.set(tags[:8].ids)]})
self.assertEqual(rec2.tag_ids, tags[:8])
rec1.invalidate_cache()
with self.assertQueryCount(4):
rec1.invalidate_cache()
rec2.write({'tag_ids': [Command.set(tags[4:].ids)]})
self.assertEqual(rec2.tag_ids, tags[4:])
rec1.invalidate_cache()
with self.assertQueryCount(3):
rec1.invalidate_cache()
rec2.write({'tag_ids': [Command.set(tags.ids)]})
self.assertEqual(rec2.tag_ids, tags)
rec1.invalidate_cache()
with self.assertQueryCount(2):
rec1.invalidate_cache()
rec2.write({'tag_ids': [Command.set(tags.ids)]})
self.assertEqual(rec2.tag_ids, tags)
@@ -412,12 +414,12 @@ class TestPerformance(SavepointCaseWithUserDemo):
with self.assertQueryCount(__system__=2, demo=2):
records.mapped('value')
records.invalidate_cache(['value'])
with self.assertQueryCount(__system__=2, demo=2):
records.invalidate_cache(['value'])
records.mapped('value')
records.invalidate_cache(['value'])
with self.assertQueryCount(__system__=2, demo=2):
records.invalidate_cache(['value'])
new_recs = records.browse(records.new(origin=record).id for record in records)
new_recs.mapped('value')