我有一个大约有 442,151,502 条记录的表。我有一个针对一个非常大的表运行的查询,该查询需要永远并且可能会进行全表扫描。这个查询非常非常慢!
SELECT DD.SYM_RUN_DATE,
DD.BRANCH_NO AS BRANCH_NO,
B.BRANCH_NAME,
DD.LOAN_SUB_TYPE || ' - ' ||
(SELECT S.LOAN_SUB_TYPE_DESC
FROM KMDW.STA_CL_LOAN_SUB_TYPE S
WHERE S.LOAN_SUB_TYPE = DD.LOAN_SUB_TYPE
AND S.LOAN_TYPE = DD.LOAN_TYPE) MA_SP,
DD.CLIENT_NO AS CLIENT_NO,
C.CLIENT_NAME,
DD.LOAN_NO AS LOAN_NO,
DD.INT_RATE,
DD.DRAWDOWN_NO,
DD.DRAWDOWN_AMOUNT,
DD.DD_DATE,
DD.MATURITY,
DD.OUTSTANDING_BASE,
DD.CURRENCY_DD,
DD.PROFIT_CENTRE,
DD.CLIENT_STATUS,
SN.SNG SO_NGAY_QH_LOAN,
P.SUB_CODE SUB_CODE,
P.SUB_DESC SUB_DESC,
P.INFO_2,
P.Info_1 ,
P.Info_3,
P.Info_5,
DD.REVERSED_MATURED,
dd.acct_exec,
f.acct_exec_name,
--added <04May2021>
COLL.COLLAT_CODE,
CC.COLLAT_REF,
COLL.BRND_MODL,
DD.Analysis_3,
UU.FTP_GROUP
FROM KMDW.FT_LOAN_DD_BALANCE_STATIC DD,
(SELECT I.LOAN_NO, I.CLIENT_NO, P.*
FROM KMDW.STA_VIB_CL_NEW_PROD P, KMDW.STA_VIB_CL_LOAN_INFOR I
WHERE PROD_CODE in ( 'OTO','MOTO')
AND P.SUB_CODE = nvl(I.INFOR_17,I.Infor_18)) P,
(SELECT I.BORROWER,loan_no, MAX(NVL(I.SNG, 0)) SNG
FROM KMDW.KM_CL_INVOICE I
WHERE I.SYM_RUN_DATE = '31-mar-2023'
GROUP BY BORROWER,loan_no) SN,
KMDW.DM_CLIENT C,
KMDW.DM_BRANCH B,
kmdw.sta_fm_acct_exec f,
--added <04May2021>
(SELECT COLLAT_REF, REF_NO
FROM KMDW.FT_COLL_POPUP CC
WHERE SYM_RUN_DATE = '31-mar-2023') CC,
(SELECT DISTINCT S.REFERENCE, S.COLLAT_CODE, V.BRND_MODL
FROM KMDW.FT_COLLATERAL_STATIC S, KMDW.STA_FM_VEHICLE V
WHERE S.REFERENCE = V.COLL_REF
AND S.COLLAT_STATUS = 'A'
AND S.SYM_RUN_DATE = '31-mar-2023') COLL,
(select DEAL_NO,wm_concat(FTP_GROUP) AS FTP_GROUP
FROM FTP_NEW.STA_VIB_FTP_GROUP_DEAL group by DEAL_NO) UU
WHERE 1 = 1
AND DD.SYM_RUN_DATE = '31-mar-2023'
AND dd.acct_exec = f.acct_exec
AND DD.CLIENT_NO = C.CLIENT_NO
AND DD.CLIENT_NO = SN.BORROWER(+)
AND DD.loan_no = SN.loan_no(+)
AND DD.BRANCH_NO = B.BRANCH_NO
--AND DD.BRANCH_NO = NVL(:IP_BRANCH, DD.BRANCH_NO)
AND DD.VERIFY = 'Y'
--AND NVL(DD.REVERSED_MATURED, 'N') NOT IN ('R', 'C', 'M')
AND P.LOAN_NO = DD.LOAN_NO
AND P.CLIENT_NO != '00103939'
--added <04May2021>
AND DD.LOAN_NO = CC.REF_NO(+)
AND CC.COLLAT_REF = COLL.REFERENCE(+)
AND DD.Loan_No = UU.DEAL_NO (+)
ORDER BY DD.BRANCH_NO, DD.CLIENT_NO;
索引大表
CREATE INDEX FT_LOAN_BAL_IDX2 ON KMDW.FT_LOAN_DD_BALANCE_STATIC (SYM_RUN_DATE,LOAN_TYPE,LOAN_SUB_TYPE,BORROWER_TYPE);
CREATE UNIQUE INDEX FT_LOAN_BAL_STA_IDX1 ON KMDW.FT_LOAN_DD_BALANCE_STATIC (SYM_RUN_DATE,LOAN_NO,DRAWDOWN_NO);
CREATE INDEX FT_LOAN_BAL_STA_IDX2 ON KMDW.FT_LOAN_DD_BALANCE_STATIC (SYM_RUN_DATE,LOAN_NO,DRAWDOWN_NO,CLIENT_NO,BRANCH_NO);
CREATE INDEX FT_LOAN_BAL_STA_IDX3 ON KMDW.FT_LOAN_DD_BALANCE_STATIC (SYM_RUN_DATE);
CREATE INDEX FT_LOAN_BAL_STA_IDX4 ON KMDW.FT_LOAN_DD_BALANCE_STATIC (TRIAL_EXPIRED,LOAN_NO);
CREATE INDEX FT_LOAN_BAL_STA_IDX6 ON KMDW.FT_LOAN_DD_BALANCE_STATIC (LOAN_NO);
解释 SQL
PLAN_TABLE_OUTPUT |
-----------------------------------------------------------------------------------------------------------------------------------------------------+
Plan hash value: 1344621840 |
|
-----------------------------------------------------------------------------------------------------------------------------------------------------|
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop ||
-----------------------------------------------------------------------------------------------------------------------------------------------------|
| 0 | SELECT STATEMENT | | 1 | 2412 | | 80998 (3)| 00:01:22 | | ||
| 1 | TABLE ACCESS BY INDEX ROWID | STA_CL_LOAN_SUB_TYPE | 1 | 24 | | 1 (0)| 00:00:01 | | ||
|* 2 | INDEX RANGE SCAN | STA_CL_LOAN_SUB_TYPE_IDX1 | 1 | | | 1 (0)| 00:00:01 | | ||
| 3 | SORT ORDER BY | | 1 | 2412 | | 80998 (3)| 00:01:22 | | ||
|* 4 | HASH JOIN | | 1 | 2412 | | 80997 (3)| 00:01:22 | | ||
| 5 | TABLE ACCESS BY INDEX ROWID | DM_CLIENT | 1 | 30 | | 1 (0)| 00:00:01 | | ||
| 6 | NESTED LOOPS | | 1 | 2333 | | 80920 (3)| 00:01:22 | | ||
| 7 | NESTED LOOPS | | 1 | 2303 | | 80919 (3)| 00:01:22 | | ||
|* 8 | HASH JOIN OUTER | | 1 | 2280 | | 80918 (3)| 00:01:22 | | ||
|* 9 | HASH JOIN OUTER | | 1 | 266 | | 70500 (2)| 00:01:11 | | ||
| 10 | NESTED LOOPS OUTER | | 1 | 206 | | 54474 (1)| 00:00:55 | | ||
| 11 | NESTED LOOPS | | 1 | 173 | | 323 (8)| 00:00:01 | | ||
|* 12 | HASH JOIN OUTER | | 1 | 150 | | 322 (8)| 00:00:01 | | ||
| 13 | TABLE ACCESS BY INDEX ROWID | DM_BRANCH | 1 | 21 | | 1 (0)| 00:00:01 | | ||
| 14 | NESTED LOOPS | | 1 | 117 | | 3 (0)| 00:00:01 | | ||
|* 15 | TABLE ACCESS BY GLOBAL INDEX ROWID| FT_LOAN_DD_BALANCE_STATIC | 1 | 96 | | 2 (0)| 00:00:01 | 39 | 39 ||
|* 16 | INDEX RANGE SCAN | FT_LOAN_BAL_STA_IDX3 | 1 | | | 1 (0)| 00:00:01 | | ||
|* 17 | INDEX RANGE SCAN | DM_BRANCH_IDX1 | 1 | | | 1 (0)| 00:00:01 | | ||
| 18 | VIEW | | 27748 | 894K| | 316 (7)| 00:00:01 | | ||
| 19 | HASH GROUP BY | | 27748 | 840K| 2416K| 316 (7)| 00:00:01 | | ||
| 20 | TABLE ACCESS BY INDEX ROWID | KM_CL_INVOICE | 27748 | 840K| | 56 (6)| 00:00:01 | | ||
|* 21 | INDEX RANGE SCAN | KM_CL_INVOICE_ID1 | 27748 | | | 17 (6)| 00:00:01 | | ||
| 22 | TABLE ACCESS BY INDEX ROWID | STA_FM_ACCT_EXEC | 1 | 23 | | 1 (0)| 00:00:01 | | ||
|* 23 | INDEX UNIQUE SCAN | STA_FM_ACCT_EXEC_PK | 1 | | | 1 (0)| 00:00:01 | | ||
|* 24 | TABLE ACCESS BY INDEX ROWID | FT_COLL_POPUP | 1 | 33 | | 54151 (1)| 00:00:55 | | ||
|* 25 | INDEX RANGE SCAN | FT_COLL_POPUP_IDX3 | 194K| | | 172 (6)| 00:00:01 | | ||
| 26 | VIEW | | 222K| 12M| | 16010 (4)| 00:00:17 | | ||
| 27 | HASH UNIQUE | | 222K| 11M| 25M| 16010 (4)| 00:00:17 | | ||
|* 28 | HASH JOIN | | 222K| 11M| 8400K| 12964 (3)| 00:00:14 | | ||
|* 29 | TABLE ACCESS BY GLOBAL INDEX ROWID | FT_COLLATERAL_STATIC | 220K| 5811K| | 4536 (3)| 00:00:05 | 27 | 27 ||
|* 30 | INDEX RANGE SCAN | FT_COLLATERAL_STATIC_IDX1 | 815K| | | 401 (10)| 00:00:01 | | ||
| 31 | TABLE ACCESS FULL | STA_FM_VEHICLE | 323K| 7902K| | 5672 (2)| 00:00:06 | | ||
| 32 | VIEW | | 721K| 1386M| | 10363 (8)| 00:00:11 | | ||
| 33 | SORT GROUP BY | | 721K| 13M| 41M| 10363 (8)| 00:00:11 | | ||
| 34 | TABLE ACCESS FULL | STA_VIB_FTP_GROUP_DEAL | 829K| 15M| | 5084 (4)| 00:00:06 | | ||
|* 35 | TABLE ACCESS BY INDEX ROWID | STA_VIB_CL_LOAN_INFOR | 1 | 23 | | 1 (0)| 00:00:01 | | ||
|* 36 | INDEX RANGE SCAN | STA_VIB_CL_LOAN_INFOR_IDX1 | 1 | | | 1 (0)| 00:00:01 | | ||
|* 37 | INDEX RANGE SCAN | DM_CLIENT_IDX1 | 1 | | | 1 (0)| 00:00:01 | | ||
|* 38 | TABLE ACCESS FULL | STA_VIB_CL_NEW_PROD | 342 | 27018 | | 77 (3)| 00:00:01 | | ||
-----------------------------------------------------------------------------------------------------------------------------------------------------|
|
Predicate Information (identified by operation id): |
--------------------------------------------------- |
|
2 - access("S"."LOAN_TYPE"=:B1 AND "S"."LOAN_SUB_TYPE"=:B2) |
4 - access("P"."SUB_CODE"=NVL("I"."INFOR_17","I"."INFOR_18")) |
8 - access("DD"."LOAN_NO"="UU"."DEAL_NO"(+)) |
9 - access("COLLAT_REF"="COLL"."REFERENCE"(+)) |
12 - access("DD"."CLIENT_NO"="SN"."BORROWER"(+) AND "DD"."LOAN_NO"="SN"."LOAN_NO"(+)) |
15 - filter("DD"."VERIFY"='Y') |
16 - access("DD"."SYM_RUN_DATE"=TO_DATE(' 2023-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) |
17 - access("DD"."BRANCH_NO"="B"."BRANCH_NO") |
21 - access("I"."SYM_RUN_DATE"=TO_DATE(' 2023-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) |
23 - access("DD"."ACCT_EXEC"="F"."ACCT_EXEC") |
24 - filter("DD"."LOAN_NO"="REF_NO"(+)) |
25 - access("SYM_RUN_DATE"(+)=TO_DATE(' 2023-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) |
28 - access("S"."REFERENCE"="V"."COLL_REF") |
29 - filter("S"."COLLAT_STATUS"='A') |
30 - access("S"."SYM_RUN_DATE"=TO_DATE(' 2023-03-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) |
35 - filter("I"."CLIENT_NO"<>'00103939') |
36 - access("I"."LOAN_NO"="DD"."LOAN_NO") |
37 - access("DD"."CLIENT_NO"="C"."CLIENT_NO") |
38 - filter("PROD_CODE"='MOTO' OR "PROD_CODE"='OTO') |
您能否指导我如何更改查询以获得更好的性能?任何帮助将不胜感激。