2016-12-05 1 views
0

J'ai une requête de jointure Oracle qui sélectionne les données très lentement. C'est comme 1000 lignes pendant 7 minutes. S'il vous plaît, pourriez-vous aider à écrire le code d'une manière différente afin que les données soient tirées plus rapidement. Les prochaines étapes pour cela est d'utiliser les valeurs de Select et de déposer les données dans la table MySQL. J'utilise l'outil Pentaho ici. MerciJ'ai une requête Oracle Join qui sélectionne les données très lentement

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) 
+0

Quels sont les index de votre table? –

+0

Bonjour Brian, j'ai des index non-uniques –

+0

S'il vous plaît les poster. –

Répondre

2
and ss.ILOAN_CODE in (select distinct loan_Number from SVP_LOAN_MASTER_INVENTORY) 

C'est candidat pour être lent. Vous n'avez pas besoin ici distinct et s'il vous plaît utilisez également jointure explicite pour la lisibilité.

Essayez:

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) 

Si cela aide pas s'il vous plaît envisager la création d'index sur les colonnes utilisées pour joindre.

+0

Bonjour Kacper, Merci, il me donne les données plus rapidement. Je suis en train de tester si les données que je reçois correspondent exactement à la production. –

+0

@ user2148257 La requête fait exactement la même chose que la vôtre, mais il vaut toujours la peine de vérifier. Bonne chance. – Kacper

+0

Bonjour Kacper, j'ai testé le code dans le pentaho et cela prend trop de temps pour lire la requête mais j'ai implémenté la même méthode que celle que vous avez mentionnée (jointure interne et suppression distincte) Cela fonctionne très bien pour les autres requêtes. Mais pour ce tableau particulier, cela ne fonctionne pas. S'il vous plaît peut-il changer cela d'une autre manière. S'il vous plaît, cela serait utile. Merci –