[PERF] account: Imp Tax Report Account>Tax

Issue:
The query for the Tax Report Account>Tax is slow.

Analyze:
The query for the Tax Report is huge, and exceeds the
join_collapse_limit threshold
(https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-JOIN-COLLAPSE-LIMIT)
of postgresql (8 by default and on our servers). It is then needed to
help the query planner to optimize this
query. Running the query with increased join_collapse_limit and checking
the explain analyze, helps in this process.

Fix:
The query planer with increased join_collapse_limit made the
res_currency joins at the very end of a truncated query.
Moving the res_currency join help as the inner join is made on AM^2 on
current position. Moving it after the base_line reduce it back to AM^1.

Benchmark:
| # Input data | Before PR | After PR |
|:-------------:|:----------:|:---------:|
|   271000 AM               |    900 s            |     13.24 s|
|   25000 AM                  |  180 s              |   1.5 s            |
|  51 AM (demo data) |52ms | 80ms |

Related task:
opw-3581671

closes odoo/odoo#148740

X-original-commit: b92b6846bfa7de8a41a6808e347fb78980baa4eb
Signed-off-by: Denis Ledoux (dle) <dle@odoo.com>
Signed-off-by: Benjamin Hanquin (beha) <beha@odoo.com>
Co-authored-by: Julien Launois (jula) <jula@odoo.com>
This commit is contained in:
Benjamin Hanquin (beha)
2024-01-10 10:28:18 +00:00
co-authored by Julien Launois
parent 2487d8d278
commit f73f764284
@@ -165,10 +165,6 @@ class AccountMoveLine(models.Model):
tax_rep.id = account_move_line.tax_repartition_line_id
JOIN account_tax tax ON
tax.id = account_move_line.tax_line_id
JOIN res_currency curr ON
curr.id = account_move_line.currency_id
JOIN res_currency comp_curr ON
comp_curr.id = account_move_line.company_currency_id
JOIN account_move_line_account_tax_rel tax_rel ON
tax_rel.account_tax_id = COALESCE(account_move_line.group_tax_id, account_move_line.tax_line_id)
JOIN account_move move ON
@@ -194,6 +190,10 @@ class AccountMoveLine(models.Model):
OR base_line.analytic_distribution = account_move_line.analytic_distribution
)
{extra_query_base_tax_line_mapping}
JOIN res_currency curr ON
curr.id = account_move_line.currency_id
JOIN res_currency comp_curr ON
comp_curr.id = account_move_line.company_currency_id
LEFT JOIN affecting_base_tax_ids tax_line_tax_ids ON tax_line_tax_ids.id = account_move_line.id
JOIN affecting_base_tax_ids base_line_tax_ids ON base_line_tax_ids.id = base_line.id
WHERE account_move_line.tax_repartition_line_id IS NOT NULL