【问题标题】:Any way to speed up this MySQL query?有什么方法可以加快这个 MySQL 查询的速度吗?
【发布时间】:2015-05-03 23:17:48
【问题描述】:

当“FROM”子句只有一个帐号 (a.account_nbr) 和一个对象代码 (a.fin_object_cd) 时,下面的查询运行很快,但是当我修改查询以使 FROM 子句具有范围时帐号和一系列目标代码,返回结果需要很长时间。它从大约一分钟运行到 20 分钟或更长时间。

查询确实返回了我想要的结果,但我需要让它运行得更快。

我能做什么?我不确定向某些列添加索引是否会有所帮助,或者是否有更好的方法来编写查询。

如果您需要有关表格的更多信息,或者我想要完成的工作,请告诉我。

select 
a.account_nbr as "Account Number", 
a.account_nm as "Account Name", 
a.fin_object_cd as "Object Code", 
a.fin_obj_cd_nm as "Object Code Name", 

(select COALESCE(sum(fin_beg_bal_ln_amt),0) from kfsprd.gl_balance_t where account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and univ_fiscal_yr = "2015" and fin_balance_typ_cd != "CB") as "Beginning Balance",

(select COALESCE(sum(trn_ldgr_entr_amt),0) FROM kfsprd.kf_f_transaction_dtl where univ_fiscal_yr = "2015" and account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and trn_debit_crdt_cd = "D") as "Debits",
(select COALESCE(sum(trn_ldgr_entr_amt),0) FROM kfsprd.kf_f_transaction_dtl where univ_fiscal_yr = "2015" and account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and trn_debit_crdt_cd = "C" and trn_ldgr_entr_amt is not null) as "Credits",

(
(select COALESCE(sum(fin_beg_bal_ln_amt),0) from kfsprd.gl_balance_t where account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and univ_fiscal_yr = "2015" and fin_balance_typ_cd != "CB") +
(select COALESCE(sum(trn_ldgr_entr_amt),0) FROM kfsprd.kf_f_transaction_dtl where univ_fiscal_yr = "2015" and account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and trn_debit_crdt_cd = "D") -
(select COALESCE(sum(trn_ldgr_entr_amt),0) FROM kfsprd.kf_f_transaction_dtl where univ_fiscal_yr = "2015" and account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and trn_debit_crdt_cd = "C") 
) as "Ending Balance"

from kfsprd.kf_f_transaction_dtl a where univ_fiscal_yr = "2015" and (univ_fiscal_prd_cd between "01" and "13" or 
univ_fiscal_prd_cd = "BB") and a.account_nbr between "1014000" and "1014005" and a.fin_object_cd between "0000" and "9999" and a.fin_balance_typ_cd != "CB"
group by account_nbr, fin_object_cd
order by account_nbr, fin_object_cd;

【问题讨论】:

  • 作为pointed it,您可能希望在 where 条件中使用的列上创建索引,除非它是 double 或 varchar。此外,explain 可能会让您知道哪里出错了。
  • 一分钟对我来说似乎并不快,但我们对您的数据集一无所知!如果是我,我会重新开始,使用适当的 DDL(和/或 sqlfiddle)连同所需的结果。
  • 感谢两位的帮助!我收到了一位熟悉我要查询的数据库结构的人的回复,他的建议非常有帮助!

标签: mysql kuali


【解决方案1】:

您能否将 fin_coa_cd 添加到 where 子句中?如果它与原始表 (gl_entry_t) 具有相同的主键,那么该表的前 3 列将是 univ_fiscal_yr、fin_coa_cd 和 account_nbr。如果您有图表代码要使用,它可能有助于 Oracle 在主查询中使用该索引。

【讨论】:

  • 哇!乔纳森!你是男人!我将 fin_coa_cd 字段添加到不仅是主查询的 where 子句中,还添加到了六个子查询中,以前需要 27 分钟的查询现在只需要大约 10 秒!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
相关资源
最近更新 更多