【问题标题】:I have Oracle Join query that picks data very slow我有 Oracle Join 查询,它选择数据的速度非常慢
【发布时间】:2016-12-05 16:49:06
【问题描述】:

我有一个 Oracle 连接查询,它选择数据的速度非常慢。这就像 1000 行 7 分钟。请您帮助以不同的方式编写代码,以便更快地提取数据。它的下一步是使用 Select 值并将数据转储到 MySQL 表中。我在这里使用 Pentaho 工具。谢谢

    select 
null id, 
ss.ILOAN_CODE  ,
ss.INST_NUM  ,
ss.INST_AMT  ,
ss.INST_PRINCIPAL  ,
ss.INST_INTEREST  ,
ss.BALANCE_PRINCIPAL  ,
ss.INST_DUE_DATE  ,
ss.PAID_FLAG  ,
ss.LATE_FEE  ,
ss.PAYMENT_DATE  ,
ss.INST_AMT_PAID  ,
ss.INST_AMT_DUE  ,
ss.REV_CHECK_NUM  ,
ss.REV_CHECK_AMT  ,
ss.CREATED_BY  ,
ss.DATE_CREATED  ,
ss.UPDATED_BY  ,
ss.DATE_UPDATED  ,
ss.INST_DAYS  ,
ss.MATURED_INTEREST  ,
ss.UNPAID_INTEREST  ,
ss.ADJ_INST_PRINCIPAL  ,
ss.ADJ_INST_AMT  ,
ss.ADJ_INST_INTEREST  ,
ss.ADJ_BALANCE_PRINCIPAL  ,
ss.ADJ_MATURED_INTEREST  ,
ss.ADJ_UNPAID_INTEREST  ,
ss.IS_PRINTED  ,
ss.RTN_FEE_AMT  ,
ss.WAIVE_FEE_AMT  ,
ss.LATE_FEE_AMT  ,
ss.APR_BALANCE_PRINCIPAL  ,
ss.ACHDEPOSIT_DATE  ,
ss.ACHRETURN_DATE  ,
ss.ACHCLEAR_DATE  ,
ss.APR_INST_INTEREST  ,
ss.APR_UNPAID_INTEREST  ,
ss.CSO_FEE  ,
ss.MATURED_CSO_FEE  ,
ss.UNPAID_CSO_FEE  ,
ss.CSO_FEE_BALANCE
from  ST_IL_SCHEDULE ss,
    ST_IL_MASTER sm,
    BO_MASTER bm
where  sm.iloan_code = ss.iloan_code
     and sm.bo_code = bm.bo_code 
     and ss.ILOAN_CODE in (select distinct loan_Number from SVP_LOAN_MASTER_INVENTORY) 

【问题讨论】:

标签: oracle oracle-sqldeveloper pentaho pentaho-spoon


【解决方案1】:
and ss.ILOAN_CODE in (select distinct loan_Number from SVP_LOAN_MASTER_INVENTORY)

这是慢的候选。这里不需要distinct,也请使用显式连接以提高可读性。

试试:

Select 
null id, 
ss.ILOAN_CODE  ,
ss.INST_NUM  ,
ss.INST_AMT  ,
ss.INST_PRINCIPAL  ,
ss.INST_INTEREST  ,
ss.BALANCE_PRINCIPAL  ,
ss.INST_DUE_DATE  ,
ss.PAID_FLAG  ,
ss.LATE_FEE  ,
ss.PAYMENT_DATE  ,
ss.INST_AMT_PAID  ,
ss.INST_AMT_DUE  ,
ss.REV_CHECK_NUM  ,
ss.REV_CHECK_AMT  ,
ss.CREATED_BY  ,
ss.DATE_CREATED  ,
ss.UPDATED_BY  ,
ss.DATE_UPDATED  ,
ss.INST_DAYS  ,
ss.MATURED_INTEREST  ,
ss.UNPAID_INTEREST  ,
ss.ADJ_INST_PRINCIPAL  ,
ss.ADJ_INST_AMT  ,
ss.ADJ_INST_INTEREST  ,
ss.ADJ_BALANCE_PRINCIPAL  ,
ss.ADJ_MATURED_INTEREST  ,
ss.ADJ_UNPAID_INTEREST  ,
ss.IS_PRINTED  ,
ss.RTN_FEE_AMT  ,
ss.WAIVE_FEE_AMT  ,
ss.LATE_FEE_AMT  ,
ss.APR_BALANCE_PRINCIPAL  ,
ss.ACHDEPOSIT_DATE  ,
ss.ACHRETURN_DATE  ,
ss.ACHCLEAR_DATE  ,
ss.APR_INST_INTEREST  ,
ss.APR_UNPAID_INTEREST  ,
ss.CSO_FEE  ,
ss.MATURED_CSO_FEE  ,
ss.UNPAID_CSO_FEE  ,
ss.CSO_FEE_BALANCE
from  ST_IL_SCHEDULE ss,
    inner join ST_IL_MASTER sm on (sm.iloan_code = ss.iloan_code)
    inner join BO_MASTER bm on (sm.bo_code = bm.bo_code)
    inner join SVP_LOAN_MASTER_INVENTORY slm on (ss.loan_code = slm.loan number)

如果这没有帮助,请考虑在连接中使用的列上创建索引。

【讨论】:

  • 您好 Kacper,谢谢它让我更快地获取数据。我正在测试我得到的数据是否与生产完全匹配。
  • @user2148257 查询与您的完全相同,但始终值得检查。祝你好运。
  • 您好 Kacper,我已经测试了 pentaho 中的代码,读取查询需要很长时间,但实现了与您提到的相同的方法(内部连接和删除不同)它适用于其他查询。但是对于这个特定的表,它不起作用。请它可以以任何其他方式改变它。请,这将是有帮助的。谢谢
  • @user2148257 我看不到改进查询的方法。您可以做的是在连接中使用的列上的索引。如果有适当的索引,您需要更深入地研究更多物理方面(如碎片、链式行)或向 DBA 寻求帮助。
  • 好的,我会联系 DBA。感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
相关资源
最近更新 更多