【 使用环境 】测试环境
【 OB or 其他组件 】ob4218
【 使用版本 】4218
【问题描述】同一条sql,条件不同,走的计划相差很大导致代价很大。
explain SELECT O.crdt_contract_no, O.customer_no, O.customer_nm, O.prod_no, O.occr_type_cd, O.busi_ccy_cd, O.contract_amt, O.contract_bal, O.overdue_amt, O.fix_rate, O.exe_rate, O.start_dt, O.mat_dt, O.bfchg_major_gatmhd_cd, O.risk_classify_cd, O.optr_no, O.hndl_org_no, O.hndl_dt, O.afrnwl_contract_epday, CI.dcmtp_cd, CI.document_no FROM contract_bscinf O INNER JOIN cust_info CI ON O.customer_no = CI.customer_no INNER JOIN prd_catalog PC ON O.prod_no = PC.prod_no AND PC.onbs_ofbs_ind = ‘01’ WHERE O.CONTRACT_STATUS IN (‘320’, ‘380’) AND O.optr_no = ‘3954’ AND O.hndl_org_no = ‘0011’;
±-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Query Plan |
±-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ===================================================================== |
| |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| |
| --------------------------------------------------------------------- |
| |0 |PX COORDINATOR | |428822 |11265472 | |
| |1 |└─EXCHANGE OUT DISTR |:EX10002|428822 |9727850 | |
| |2 | └─HASH JOIN | |428822 |6267169 | |
| |3 | ├─EXCHANGE IN DISTR | |428822 |4814813 | |
| |4 | │ └─EXCHANGE OUT DISTR (PKEY)|:EX10001|428822 |3471786 | |
| |5 | │ └─HASH JOIN | |428822 |449252 | |
| |6 | │ ├─EXCHANGE IN DISTR | |178 |253 | |
| |7 | │ │ └─EXCHANGE OUT DISTR |:EX10000|178 |186 | |
| |8 | │ │ └─TABLE FULL SCAN |PC |178 |34 | |
| |9 | │ └─TABLE FULL SCAN |O |428822 |310437 | |
| |10| └─PX PARTITION ITERATOR | |3269544 |148602 | |
| |11| └─TABLE FULL SCAN |CI(tt) |3269544 |148602 | |
| ===================================================================== |
Outputs & filters: |
---|
0 - output([INTERNAL_FUNCTION(O.CRDT_CONTRACT_NO, O.CUSTOMER_NO, O.CUSTOMER_NM, O.PROD_NO, O.OCCR_TYPE_CD, O.BUSI_CCY_CD, O.CONTRACT_AMT, O.CONTRACT_BAL, |
O.OVERDUE_AMT, O.FIX_RATE, O.EXE_RATE, O.START_DT, O.MAT_DT, O.BFCHG_MAJOR_GATMHD_CD, O.RISK_CLASSIFY_CD, O.OPTR_NO, O.HNDL_ORG_NO, O.HNDL_DT, O.AFRNWL_CONTRACT_EPDAY, |
CI.DCMTP_CD, CI.DOCUMENT_NO)]), filter(nil), rowset=256 |
1 - output([INTERNAL_FUNCTION(O.CRDT_CONTRACT_NO, O.CUSTOMER_NO, O.CUSTOMER_NM, O.PROD_NO, O.OCCR_TYPE_CD, O.BUSI_CCY_CD, O.CONTRACT_AMT, O.CONTRACT_BAL, |
O.OVERDUE_AMT, O.FIX_RATE, O.EXE_RATE, O.START_DT, O.MAT_DT, O.BFCHG_MAJOR_GATMHD_CD, O.RISK_CLASSIFY_CD, O.OPTR_NO, O.HNDL_ORG_NO, O.HNDL_DT, O.AFRNWL_CONTRACT_EPDAY, |
CI.DCMTP_CD, CI.DOCUMENT_NO)]), filter(nil), rowset=256 |
dop=1 |
2 - output([O.CUSTOMER_NO], [O.PROD_NO], [O.CRDT_CONTRACT_NO], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], [O.CONTRACT_AMT], |
[O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], [O.HNDL_DT], |
[O.AFRNWL_CONTRACT_EPDAY], [CI.DCMTP_CD], [CI.DOCUMENT_NO]), filter(nil), rowset=256 |
equal_conds([O.CUSTOMER_NO = CI.CUSTOMER_NO]), other_conds(nil) |
3 - output([O.CUSTOMER_NO], [O.PROD_NO], [O.CRDT_CONTRACT_NO], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], [O.CONTRACT_AMT], |
[O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], [O.HNDL_DT], |
[O.AFRNWL_CONTRACT_EPDAY]), filter(nil), rowset=256 |
4 - output([O.CUSTOMER_NO], [O.PROD_NO], [O.CRDT_CONTRACT_NO], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], [O.CONTRACT_AMT], |
[O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], [O.HNDL_DT], |
[O.AFRNWL_CONTRACT_EPDAY]), filter(nil), rowset=256 |
(#keys=1, [O.CUSTOMER_NO]), is_single, dop=1 |
5 - output([O.CUSTOMER_NO], [O.PROD_NO], [O.CRDT_CONTRACT_NO], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], [O.CONTRACT_AMT], |
[O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], [O.HNDL_DT], |
[O.AFRNWL_CONTRACT_EPDAY]), filter(nil), rowset=256 |
equal_conds([O.PROD_NO = PC.PROD_NO]), other_conds(nil) |
6 - output([PC.PROD_NO]), filter(nil), rowset=256 |
7 - output([PC.PROD_NO]), filter(nil), rowset=256 |
is_single, dop=1 |
8 - output([PC.PROD_NO]), filter([PC.ONBS_OFBS_IND = cast(‘01’, VARCHAR(1048576))]), rowset=256 |
access([PC.PROD_NO], [PC.ONBS_OFBS_IND]), partitions(p0) |
is_index_back=false, is_global_index=false, filter_before_indexback[false], |
range_key([PC.PROD_NO]), range(MIN ; MAX)always true |
9 - output([O.CRDT_CONTRACT_NO], [O.CUSTOMER_NO], [O.PROD_NO], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], [O.CONTRACT_AMT], |
[O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], [O.HNDL_DT], |
[O.AFRNWL_CONTRACT_EPDAY]), filter([O.CONTRACT_STATUS IN (cast(‘320’, VARCHAR(1048576)), cast(‘380’, VARCHAR(1048576)))], [O.HNDL_ORG_NO = cast(‘0011’, |
VARCHAR(1048576))], [O.OPTR_NO = cast(‘3954’, VARCHAR(1048576))]), rowset=256 |
access([O.CRDT_CONTRACT_NO], [O.CUSTOMER_NO], [O.PROD_NO], [O.CONTRACT_STATUS], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], |
[O.CONTRACT_AMT], [O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], |
[O.HNDL_DT], [O.AFRNWL_CONTRACT_EPDAY]), partitions(p0) |
is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], |
range_key([O.CRDT_CONTRACT_NO]), range(MIN ; MAX)always true |
10 - output([CI.CUSTOMER_NO], [CI.DCMTP_CD], [CI.DOCUMENT_NO]), filter(nil), rowset=256 |
affinitize, force partition granule |
11 - output([CI.CUSTOMER_NO], [CI.DCMTP_CD], [CI.DOCUMENT_NO]), filter(nil), rowset=256 |
access([CI.CUSTOMER_NO], [CI.DCMTP_CD], [CI.DOCUMENT_NO]), partitions(p[0-255]) |
is_index_back=false, is_global_index=false, |
range_key([CI.CUSTOMER_NO], [CI.DCMTP_CD], [CI.DOCUMENT_NO]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true |
±-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
62 rows in set (0.021 sec)
MySQL [sjcscredit]> explain SELECT O.crdt_contract_no,O.customer_no,O.customer_nm,O.prod_no,O.occr_type_cd,O.busi_ccy_cd,O.contract_amt,O.contract_bal,O.overdue_amt,O.fix_rate,O.exe_rate,O.start_dt,O.mat_dt,O.bfchg_major_gatmhd_cd,O.risk_classify_cd,O.optr_no,O.hndl_org_no,O.hndl_dt,O.afrnwl_contract_epday,CI.dcmtp_cd,CI.document_no FROM contract_bscinf O,cust_info CI WHERE O.customer_no=CI.customer_no AND EXISTS ( SELECT 1 FROM prd_catalog PC WHERE O.prod_no=PC.prod_no AND PC.onbs_ofbs_ind=‘01’) AND O.CONTRACT_STATUS IN (‘320’,‘380’) AND O.optr_no=‘2523’ AND O.hndl_org_no=‘1378’
→ ;
±---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Query Plan |
±---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| =========================================================================================== |
| |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| |
| ------------------------------------------------------------------------------------------- |
| |0 |PX COORDINATOR | |1 |707 | |
| |1 |└─EXCHANGE OUT DISTR |:EX10001 |1 |707 | |
| |2 | └─NESTED-LOOP JOIN | |1 |707 | |
| |3 | ├─EXCHANGE IN DISTR | |1 |686 | |
| |4 | │ └─EXCHANGE OUT DISTR (PKEY)|:EX10000 |1 |686 | |
| |5 | │ └─NESTED-LOOP JOIN | |1 |686 | |
| |6 | │ ├─TABLE RANGE SCAN |O(contract_bscinf_OPTR_NO_IDX)|1 |668 | |
| |7 | │ └─DISTRIBUTED TABLE GET|PC |1 |18 | |
| |8 | └─PX PARTITION ITERATOR | |1 |5126 | |
| |9 | └─TABLE GET |CI |1 |5126 | |
| =========================================================================================== |
Outputs & filters: |
---|
0 - output([INTERNAL_FUNCTION(O.CRDT_CONTRACT_NO, O.CUSTOMER_NO, O.CUSTOMER_NM, O.PROD_NO, O.OCCR_TYPE_CD, O.BUSI_CCY_CD, O.CONTRACT_AMT, O.CONTRACT_BAL, |
O.OVERDUE_AMT, O.FIX_RATE, O.EXE_RATE, O.START_DT, O.MAT_DT, O.BFCHG_MAJOR_GATMHD_CD, O.RISK_CLASSIFY_CD, O.OPTR_NO, O.HNDL_ORG_NO, O.HNDL_DT, O.AFRNWL_CONTRACT_EPDAY, |
CI.DCMTP_CD, CI.DOCUMENT_NO)]), filter(nil), rowset=16 |
1 - output([INTERNAL_FUNCTION(O.CRDT_CONTRACT_NO, O.CUSTOMER_NO, O.CUSTOMER_NM, O.PROD_NO, O.OCCR_TYPE_CD, O.BUSI_CCY_CD, O.CONTRACT_AMT, O.CONTRACT_BAL, |
O.OVERDUE_AMT, O.FIX_RATE, O.EXE_RATE, O.START_DT, O.MAT_DT, O.BFCHG_MAJOR_GATMHD_CD, O.RISK_CLASSIFY_CD, O.OPTR_NO, O.HNDL_ORG_NO, O.HNDL_DT, O.AFRNWL_CONTRACT_EPDAY, |
CI.DCMTP_CD, CI.DOCUMENT_NO)]), filter(nil), rowset=16 |
dop=1 |
2 - output([O.CUSTOMER_NO], [O.PROD_NO], [O.CRDT_CONTRACT_NO], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], [O.CONTRACT_AMT], |
[O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], [O.HNDL_DT], |
[O.AFRNWL_CONTRACT_EPDAY], [CI.DCMTP_CD], [CI.DOCUMENT_NO]), filter(nil), rowset=16 |
conds(nil), nl_params_([O.CUSTOMER_NO(:0)]), use_batch=false |
3 - output([PARTITION_ID], [O.CUSTOMER_NO], [O.PROD_NO], [O.CRDT_CONTRACT_NO], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], |
[O.CONTRACT_AMT], [O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], |
[O.HNDL_DT], [O.AFRNWL_CONTRACT_EPDAY]), filter(nil), rowset=16 |
4 - output([PARTITION_ID], [O.CUSTOMER_NO], [O.PROD_NO], [O.CRDT_CONTRACT_NO], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], |
[O.CONTRACT_AMT], [O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], |
[O.HNDL_DT], [O.AFRNWL_CONTRACT_EPDAY]), filter(nil), rowset=16 |
(#keys=1, [O.CUSTOMER_NO]), is_single, dop=1 |
5 - output([O.CUSTOMER_NO], [O.PROD_NO], [O.CRDT_CONTRACT_NO], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], [O.CONTRACT_AMT], |
[O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], [O.HNDL_DT], |
[O.AFRNWL_CONTRACT_EPDAY]), filter(nil), rowset=16 |
conds(nil), nl_params_([O.PROD_NO(:2)]), use_batch=true |
6 - output([O.CRDT_CONTRACT_NO], [O.CUSTOMER_NO], [O.PROD_NO], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], [O.CONTRACT_AMT], |
[O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], [O.HNDL_DT], |
[O.AFRNWL_CONTRACT_EPDAY]), filter([O.HNDL_ORG_NO = cast(‘1378’, VARCHAR(1048576))], [O.CONTRACT_STATUS IN (cast(‘320’, VARCHAR(1048576)), cast(‘380’, VARCHAR(1048576)))]), rowset=16 |
access([O.CRDT_CONTRACT_NO], [O.CUSTOMER_NO], [O.PROD_NO], [O.CONTRACT_STATUS], [O.OPTR_NO], [O.HNDL_ORG_NO], [O.CUSTOMER_NM], [O.OCCR_TYPE_CD], [O.BUSI_CCY_CD], |
[O.CONTRACT_AMT], [O.CONTRACT_BAL], [O.OVERDUE_AMT], [O.FIX_RATE], [O.EXE_RATE], [O.START_DT], [O.MAT_DT], [O.BFCHG_MAJOR_GATMHD_CD], [O.RISK_CLASSIFY_CD], |
[O.HNDL_DT], [O.AFRNWL_CONTRACT_EPDAY]), partitions(p0) |
is_index_back=true, is_global_index=false, filter_before_indexback[false,false], |
range_key([O.OPTR_NO], [O.CRDT_CONTRACT_NO]), range(2523,MIN ; 2523,MAX), |
range_cond([O.OPTR_NO = cast(‘2523’, VARCHAR(1048576))]) |
7 - output(nil), filter([PC.ONBS_OFBS_IND = cast(‘01’, VARCHAR(1048576))]), rowset=16 |
access([GROUP_ID], [PC.ONBS_OFBS_IND]), partitions(p0) |
is_index_back=false, is_global_index=false, filter_before_indexback[false], |
range_key([PC.PROD_NO]), range(MIN ; MAX), |
range_cond([:2 = PC.PROD_NO]) |
8 - output([CI.DCMTP_CD], [CI.DOCUMENT_NO]), filter(nil), rowset=16 |
affinitize, force partition granule |
9 - output([CI.DCMTP_CD], [CI.DOCUMENT_NO]), filter(nil), rowset=16 |
access([CI.DCMTP_CD], [CI.DOCUMENT_NO]), partitions(p[0-255]) |
is_index_back=false, is_global_index=false, |
range_key([CI.CUSTOMER_NO]), range(MIN ; MAX), |
range_cond([:0 = CI.CUSTOMER_NO]) |
±---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
59 rows in set (0.021 sec)