[FIX] account_financial_report: Avoid slow vacuum due to ondelete=cascade
`report_journal_ledger` is auto-vacuumed as any transient model, but has some ondelete="cascade" constraints that auto-remove subtables when a record is removed, doing this operation very slow when selecting these sub-records. Letting default ondelete="set null" would result in same performance bottleneck, as the select on sub-table is performed the same for setting "null" value on them. As a solution, and for avoiding a costly index operation, we delete by SQL sub-tables rows in advance. A bit of extra logic has been added for avoiding to remove that records if it's not the turn of vacuum the parent table.pull/582/head
parent
8fb32f037f
commit
f22cb07c76
|
@ -16,6 +16,10 @@
|
||||||
* Mihai Fekete <feketemihai@gmail.com>
|
* Mihai Fekete <feketemihai@gmail.com>
|
||||||
* Miquel Raïch <miquel.raich@eficent.com>
|
* Miquel Raïch <miquel.raich@eficent.com>
|
||||||
* Isaac Gallart <igallart@puntsistemes.com>
|
* Isaac Gallart <igallart@puntsistemes.com>
|
||||||
|
* `Tecnativa <https://www.tecnativa.com>`__:
|
||||||
|
|
||||||
|
* Pedro M. Baeza
|
||||||
|
* Sergio Teruel
|
||||||
|
|
||||||
Much of the work in this module was done at a sprint in Sorrento, Italy in
|
Much of the work in this module was done at a sprint in Sorrento, Italy in
|
||||||
April 2016.
|
April 2016.
|
||||||
|
|
|
@ -612,6 +612,19 @@ class ReportJournalLedger(models.TransientModel):
|
||||||
def get_html(self, given_context=None):
|
def get_html(self, given_context=None):
|
||||||
return self._get_html()
|
return self._get_html()
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _transient_vacuum(self, force=False):
|
||||||
|
"""Remove journal ledger subtables first for avoiding a costly
|
||||||
|
ondelete operation.
|
||||||
|
"""
|
||||||
|
# Next 3 lines adapted from super method for mimicking behavior
|
||||||
|
cls = type(self)
|
||||||
|
if not force and (cls._transient_check_count < 21):
|
||||||
|
return True # no vacuum cleaning this time
|
||||||
|
self.env.cr.execute("DELETE FROM report_journal_ledger_move_line")
|
||||||
|
self.env.cr.execute("DELETE FROM report_journal_ledger_move")
|
||||||
|
return super(ReportJournalLedger, self)._transient_vacuum(force=force)
|
||||||
|
|
||||||
|
|
||||||
class ReportJournalLedgerJournal(models.TransientModel):
|
class ReportJournalLedgerJournal(models.TransientModel):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue