下面的 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;
然后你聚合了这么多列,我什至想知道是否需要聚合。
下面的 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;
然后你聚合了这么多列,我什至想知道是否需要聚合。