[英]How to tune UNION ALL query?
下面的MySQL查詢結果為每個帳戶代碼( acctcode
)的貸方和借方之和,並用union all
產生總數。 ledg_post
表具有570萬條記錄,並已建立索引。 查詢仍然需要1分鍾才能執行。 請幫助我調整此查詢。
select b.acnt_code as acctcode
, b.disp_name as acctname
, sum(amt_dr) as debit
, sum(amt_cr) as credit
, (sum(amt_dr)- sum(amt_cr)) as closingbalance
, a.txn_code as txn_code
from ledg_post a
, gl_acnts b
, mst_loan lmt
where a.acnt_code = b.acnt_code
group
by b.acnt_code
union all
select ' ' acctcode
, ' Grand Total ' acctname
, sum(amt_dr) debit
, sum(amt_cr) credit
, (sum(amt_dr)- sum(amt_cr)) closingbalance
, '' txn_code
from ledg_post a
, mst_loan lmt
where lmt.loan_id = a.ref_id
create table ledg_post
( txn_code int(11)
, ref_id int(11)
, acnt_code int(11)
, amt_dr decimal(20, 2)
, amt_cr decimal(20, 2)
);
create table gl_acnts
( glm_acnt_code int
, glm_acnt_disp_name varchar(50)
);
create table mst_loan
( lmt_loan_id int(11)
, lmt_clnt_id int(11)
);
無需使用UNION ALL
,您可以使用GROUP BY ... WITH ROLLUP實現
嘗試這個:
SELECT b.acnt_code AS acctcode, IFNULL(b.disp_name, ' Grand Total ') AS acctname,
SUM(a.amt_dr) AS debit, SUM(a.amt_cr) AS credit,
(SUM(a.amt_dr)- SUM(a.amt_cr)) AS closingbalance,
IFNULL(a.txn_code, '') AS txn_code
FROM ledg_post a
INNER JOIN gl_acnts b ON a.acnt_code=b.acnt_code
GROUP BY acctcode WITH ROLLUP
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.