带有左连接和连接值的 Oracle SQL 查询运行时间过长

问题描述 投票:0回答:0

我加入了3个子查询以获得最终结果。然而,问题是我需要 45 分钟才能得到结果。

我需要帮助来优化运行查询并给出结果所需的时间。

这是我的 SQL 查询:

SELECT C.TRANSACTION_ID, A.LOAN_NUMBER, A.TRAN_DATE, A.ADVANCE_TYPE, A.ADV_PROCESSOR_ID, A.ADV_TRAN_CODE, A.CORP_PAYEE_ID, A.REASON_CODE, A.CATEGORY_DESCRIPTION, A.TRANSACTION_AMOUNT, C.CLAIM_AMOUNT, A.PAYEE_ID, B.DEPT, B.CAT, B.DESCRIPTION AS SUBCAT, B.LIITEM_NOTE, B.COMPL_DT, B.SVC_FROM_DT, B.SVC_TO_DT, NVL(B.VENDOR_NAME,A.PAYEE_ID) AS VENDOR_NAME, B.INVOICE_NUMBER, C.CLAIM_ID, C.CLAIM_STATUS, C.CLAIM_TYPE, C.LOSS_REASON, C.DETAILED_LOSS_REASON

FROM 
(SELECT LOAN_NUMBER, NVL(CA_HIST_ORIGINAL_DISB_DATE,CA_HIST_TRANSACTION_DATE) TRAN_DATE, CASE   WHEN CA_HIST_RECOVERABLE_CODE IN ('T') THEN 'TPCA'  WHEN CA_HIST_RECOVERABLE_CODE IN ('N') THEN 'NRCA'  WHEN CA_HIST_RECOVERABLE_CODE IN ('R') THEN 'MRCA'  END AS ADVANCE_TYPE, CA_HIST_PROCESSOR_ID AS ADV_PROCESSOR_ID, CA_HIST_TRANSACTION_CODE ADV_TRAN_CODE, CA_HIST_CORPORATE_PAYEE_ID CORP_PAYEE_ID, CA_HIST_REASON_CODE REASON_CODE, CA_HIST_REASON_DESCRIPTION AS CATEGORY_DESCRIPTION, (SELECT PAYEE_ADDRESS_LINE_1 FROM CPI.D_PAYEE@OCN_DBL_MICCRPT_CONN WHERE PAYEE_ID = CA_HIST_PAYEE_ID AND ROWNUM = 1) AS PAYEE_ID, (CASE WHEN CA_HIST_TRANSACTION_CODE IN (710,711,712,713,714,766) THEN (CA_HIST_ADVANCE_AMOUNT) * - 1 ELSE (CA_HIST_ADVANCE_AMOUNT) END) TRANSACTION_AMOUNT, (ROW_NUMBER() OVER (PARTITION BY NVL(CA_HIST_ORIGINAL_DISB_DATE,CA_HIST_TRANSACTION_DATE), CA_HIST_CORPORATE_PAYEE_ID, CA_HIST_REASON_CODE, (CASE WHEN CA_HIST_TRANSACTION_CODE IN (710,711,712,713,714,766) THEN ABS(CA_HIST_ADVANCE_AMOUNT) * - 1   ELSE (CA_HIST_ADVANCE_AMOUNT) END) ORDER BY NVL(CA_HIST_ORIGINAL_DISB_DATE,CA_HIST_TRANSACTION_DATE))) ROW_CORP FROM BDE.CORPORATE_ADV_HIST@OCN_MICC_GC_RPT_CDW_CONN) A

LEFT JOIN (SELECT (ROW_NUMBER() OVER (PARTITION BY TRUNC(PYMT.CREATD_DT),PYMT.TRANS_CD,PYMT.CORP_ADV_CD,PYMT.RSN_CD,PYMT.DISBD_AMT ORDER BY TRUNC(PYMT.CREATD_DT))) AS ROW_LPS, LITEM.SVCR_LOAN_NUM AS LOAN_NUMBER, TRUNC(PYMT.CREATD_DT) AS TRANDATE, PYMT.TRANS_CD, PYMT.CORP_ADV_CD, PYMT.RSN_CD, INV.DEPT, LITEM.CAT, LITEM.SUB_CAT AS DESCRIPTION, LITEM.LIITEM_NOTE, PYMT.DISBD_AMT AS AMOUNT, LITEM.LI_ITEM_DT AS COMPL_DT, LITEM.SVC_FROM_DT, LITEM.SVC_TO_DT, INV.VEND_NM AS VENDOR_NAME, LITEM.INVC_NUM AS INVOICE_NUMBER FROM LS_INVC.INVC@OCN_MICC_GC_RPT_cdw_CONN INV, LS_INVC.INVC_LIITEM@OCN_MICC_GC_RPT_cdw_CONN LITEM, LS_INVC.INVC_LIITEM_PAYMT@OCN_MICC_GC_RPT_cdw_CONN PYMT where INV.INVC_ID=LITEM.INVC_ID AND LITEM.INVC_LIITEM_ID=PYMT.INVC_LIITEM_ID) B ON TO_NUMBER(A.LOAN_NUMBER)=B.LOAN_NUMBER AND A.TRAN_DATE=B.TRANDATE AND A.CORP_PAYEE_ID||'_'||A.REASON_CODE=B.CORP_ADV_CD||'_'||B.RSN_CD AND A.TRANSACTION_AMOUNT=B.AMOUNT AND A.ROW_CORP=B.ROW_LPS

LEFT JOIN (SELECT ROW_NUMBER() OVER (PARTITION BY C.TRANSACTION_DATE, SUBSTR(C.CATEGORY_CODE,1,10), (C.TRANSACTION_AMOUNT) ORDER BY C.TRANSACTION_DATE) ROW_MICC, TRANSACTION_ID, CATEGORY_CODE, TRANSACTION_AMOUNT, LOAN_NUM, CLAIM_ID, TRANSACTION_DATE, CLAIM_AMOUNT, CLAIM_STATUS, CLAIM_TYPE, LOSS_REASON, DETAILED_LOSS_REASON FROM MICC_RPT.CL_TRAN_LVL_DATA C) C ON B.LOAN_NUMBER=TO_NUMBER(C.LOAN_NUM) AND B.TRANDATE=C.TRANSACTION_DATE AND B.CORP_ADV_CD||'_'||B.RSN_CD=SUBSTR(C.CATEGORY_CODE,1,10) AND B.AMOUNT=C.TRANSACTION_AMOUNT AND B.ROW_LPS=C.ROW_MICC

WHERE A.LOAN_NUMBER='1234567890'
ORDER BY A.LOAN_NUMBER, A.TRAN_DATE, A.ADV_TRAN_CODE, A.CORP_PAYEE_ID, A.REASON_CODE, A.TRANSACTION_AMOUNT
;

我只有数据库的读取权限,无法创建索引或更改表。我只能使用 select 语句运行查询。

我花了几个小时在网上搜索解决方案,但找不到。请将此问题提交给堆栈溢出专家来解决!

sql oracle performance subquery left-join
© www.soinside.com 2019 - 2024. All rights reserved.