下面的 SQL 查询大约需要 6-7 分钟来执行,它将 return ~ 5,833,135 行,可以帮助我解决它的性能

The below SQL query takes around 6-7 min to execute and it will return ~ 5,833,135 rows, can any help me resolve it performance

下面的 SQL 查询大约需要 6-7 分钟来执行,它将 return ~ 5,833,135 行,任何可以帮助我解决它的性能

SQL

select
    min(aml.id) as id,
    aml.name as name,
    round(sum(aml.debit),2) as debit,
    round(sum(aml.credit),2) as credit,
    round(sum(aml.balance),2) as balance,
    aml.account_id as account_id,
    aml.move_id as move_id,
    aml.payment_id as payment_id,
    aml.statement_id as statement_id,
    aml.journal_id as journal_id,
    aml.date as date,
    aml.company_id as company_id,
    aml.invoice_id as invoice_id,
    aml.partner_id as partner_id,
    aml.company_currency_id as company_currency_id
from 
    account_move_line aml
    left join account_account acc on (acc.id = aml.account_id)
    left join account_move am on (am.id = aml.move_id)
    left join account_payment ap on (ap.id = aml.payment_id)
    left join account_bank_statement abs on (abs.id = aml.statement_id)
    left join account_journal aj on (aj.id = aml.journal_id)
    left join res_company comp on (comp.id = aml.company_id)
    left join account_invoice ai on (ai.id = aml.invoice_id)
    left join res_partner resp on (resp.id = aml.partner_id)
    left join res_currency rc on (rc.id = aml.company_currency_id)
group by
    aml.name,
    aml.debit,
    aml.credit,
    aml.balance,
    aml.account_id,
    aml.move_id,
    aml.payment_id,
    aml.statement_id,
    aml.journal_id,
    aml.date,
    aml.company_id,
    aml.invoice_id,
    aml.partner_id,
    aml.company_currency_id

对于这样的查询,您可以优化的不多。

有效性顺序:

  • 在机器中放置足够的 RAM 以缓存整个数据库。

  • 将此查询的 work_mem 设置得尽可能大。

  • 如果 EXPLAIN 输出中存在嵌套循环连接(不太可能),连接列上的索引会有所帮助。

您只能从 table 中选择,这是 left join 系列中的第一个。

我想知道这是否符合您的要求:

select min(aml.id) as id,
       aml.name as name,
       round(sum(aml.debit), 2) as debit,
       round(sum(aml.credit), 2) as credit,
       round(sum(aml.balance), 2) as balance,
       aml.account_id as account_id,
       aml.move_id as move_id,
       aml.payment_id as payment_id,
       aml.statement_id as statement_id,
       aml.journal_id as journal_id,
       aml.date as date,
       aml.company_id as company_id,
       aml.invoice_id as invoice_id,
       aml.partner_id as partner_id,
       aml.company_currency_id as company_currency_id
from account_move_line aml
group by aml.name, aml.debit, aml.credit, aml.balance,
         aml.account_id, aml.move_id, aml.payment_id,
         aml.statement_id, aml.journal_id, aml.date,
         aml.company_id,  aml.invoice_id, aml.partner_id,
         aml.company_currency_id;

然后你聚合了这么多列,我什至想知道是否需要聚合。