KingbaseES数据库-生产环境慢查询性能优化案例
一、背景
在生产环境中,慢查询不仅影响系统、业务的正常处理。同时严重影响用户的使用感受。
二、表相关信息
2.1 表结构及索引:
Table "yktcore.t_dtl_ymt"
栏位 | 类型 | 校对规则 | 可空的 | 预设
--------------------+-----------------------------+----------+----------+--------------
sys_sett_date | character(8 char) | | not null |
cen_seq | character varying(10 char) | | not null |
sett_date | character(8 char) | | |
chnl_uk | character varying(100 char) | | |
trans_uk | character varying(100 char) | | |
chnl_id | character varying(2 char) | | |
unit_id | character varying(11 char) | | |
unit_name | character varying(100 char) | | |
mchnt_id | character varying(15 char) | | |
mchnt_name | character varying(100 char) | | |
pos_id | character varying(20 char) | | |
sam_id | character varying(12 char) | | |
pos_name | character varying(100 char) | | |
acq_inst_cd | character varying(11 char) | | |
card_no | character varying(20 char) | | |
card_org | character varying(3 char) | | |
iss_inst_cd | character varying(16 char) | | |
txn_type | character(2 char) | | |
txn_st | character(2 char) | | |
inn_txn_type | character varying(8 char) | | |
txn_date | character(8 char) | | |
txn_time | character(6 char) | | |
txn_amt | numeric(10,0) | | |
org_amt | numeric(10,0) | | |
fee | numeric(10,0) | | |
pos_seq | character varying(10 char) | | |
order_no | character varying(50 char) | | |
pay_unit_id | character varying(11 char) | | |
pay_unit_name | character varying(100 char) | | |
pay_mchnt_id | character varying(15 char) | | |
pay_mchnt_name | character varying(100 char) | | |
pay_st | character varying(2 char) | | |
pay_seq | character varying(100 char) | | |
plat_seq | character varying(32 char) | | |
deduct_date | character varying(8 char) | | |
deduct_time | character varying(6 char) | | |
match_flg | character(1 char) | | |
pkg_id | character varying(12 char) | | |
txn_order | numeric(10,0) | | |
test_flg | character(2 char) | | |
err_cd | character varying(6 char) | | |
inn_err | character varying(6 char) | | |
cust_no | character varying(20 char) | | |
adj_flg | numeric(4,0) | | |
fund_src | character varying(2 char) | | |
spec_type | character varying(4 char) | | |
spec_sys_sett_date | character varying(8 char) | | |
spec_seq | character varying(12 char) | | |
biz_attr | character(2 char) | | |
biz_amt | numeric(10,0) | | |
part_no | numeric(3,0) | | not null |
rsvd | character varying(10 char) | | |
fmf_chnl_id | character varying(8 char) | | |
qr_chnl_id | character varying(8 char) | | |
user_type | character varying(2 char) | | |
medium_type | character varying(2 char) | | |
pay_acc_no | character varying(20 char) | | |
pay_type | numeric(4,0) | | |
opera_date | character varying(8 char) | | |
orig_txn_amt | numeric(10,0) | | |
orig_plat_seq | character varying(32 char) | | |
orig_fmf_chnl_id | character varying(8 char) | | |
orig_qr_chnl_id | character varying(8 char) | | |
match_type | character varying(2 char) | | |
fare_type | character varying(2 char) | | |
ticket_type | character varying(4 char) | | |
orig_opera_date | character varying(8 char) | | |
if_rtn | character varying(1 char) | | | 'N'::varchar
tot_rtn_amt | numeric(10,0) | | | 0
match_cnt | numeric(4,0) | | | 0
fvr_amt | numeric(10,0) | | | 0
actl_amt | numeric(10,0) | | |
fvr_mode | numeric(2,0) | | | 0
fvr_type1 | numeric(4,0) | | | 0
fvr_type2 | numeric(4,0) | | | 0
fvr_type3 | numeric(4,0) | | | 0
fvr_amt1 | numeric(10,0) | | | 0
fvr_amt2 | numeric(10,0) | | | 0
fvr_amt3 | numeric(10,0) | | | 0
Indexes:
"pk_t_dtl_ymt_d281c30c" PRIMARY KEY, btree (sys_sett_date, cen_seq, part_no)
"idx_uk_t_dtl_ymt_198a4137" UNIQUE, btree (trans_uk, part_no)
"idx_t_dtl_ymt_1" btree (sett_date)
"idx_t_dtl_ymt_cardno_f2cf54bf" btree (card_no)
"idx_uk_t_dtl_ymt_1_38290b9d" btree (plat_seq)
Table "yktcore.t_spec_ymt"
栏位 | 类型 | 校对规则 | 可空的 | 预设
----------------------+------------------------------+----------+----------+------
sys_sett_date | character(8 char) | | not null |
cen_date | character varying(8 char) | | |
cen_seq | character varying(10 char) | | not null |
txn_type | character(2 char) | | |
txn_st | character(2 char) | | |
pay_unit | character varying(8 char) | | |
pay_mchnt | character varying(12 char) | | |
up_time | character varying(14 char) | | |
up_line_id | character varying(12 char) | | |
up_stat_id | character varying(12 char) | | |
up_stat_name | character varying(30 char) | | |
up_pos_id | character varying(10 char) | | |
up_pos_cos_cnt | numeric(12,0) | | |
up_hash_val | character varying(48 char) | | |
dn_time | character varying(14 char) | | |
dn_line_id | character varying(12 char) | | |
dn_stat_id | character varying(12 char) | | |
dn_stat_name | character varying(30 char) | | |
dn_pos_id | character varying(10 char) | | |
dn_pos_cos_cnt | numeric(12,0) | | |
dn_hash_val | character varying(48 char) | | |
txn_amt | numeric(12,0) | | |
bef_favordiscountamt | numeric(12,0) | | |
aft_favordiscountamt | numeric(12,0) | | |
up_qr_info | character varying(1000 char) | | |
dn_qr_info | character varying(1000 char) | | |
data_send_time | character varying(14 char) | | |
fvr_type | character varying(2 char) | | |
fvr_name | character varying(40 char) | | |
fvr_amt | numeric(12,0) | | |
Indexes:
"pk_t_spec_ymt_b490c786" PRIMARY KEY, btree (sys_sett_date, cen_seq)
2.2 数据量:
select count(1) from T_DTL_YMT;
count
-----------
226802274
(1 行记录)
select count(1) from T_SPEC_YMT;
count
-----------
215649506
(1 行记录)
三、原始慢查询语句及执行计划
3.1 查询sql语句:
select * from (
select sys_sett_date sysDatee,cen_seq seq, t.spec_sys_Sett_Date AS sysSettDate, t.txn_type AS txnType, t.txn_St AS txnSt, t.sett_date AS settDate, t.unit_id AS unitId, u.unit_sname unitName, t.pos_id AS posId, t.sam_id AS samId,p.pos_name posName, t.card_no AS cardNo, t.txn_date AS txnDate, t.txn_time AS txnTime,t.txn_amt AS txnAmt, t.org_amt as orgAmt,t.spec_seq as cenSeq,
txn_type||txn_St||'-'||(select dsp from t_par_txn_type_st where txn_type=t.txn_type and txn_st=t.txn_st) as txnDsp,
(select b.UP_LINE_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) upLineId ,
(select b.dn_LINE_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) dnLineId,
(select b.UP_time from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) upDttm ,
(select b.UP_STAT_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) upStatId ,
(select b.UP_STAT_NAME from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) upStatName ,
(select b.dn_STAT_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) dnStatId,
(select b.DN_STAT_NAME from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) dnStatName , '' upBusId, t.err_cd AS errCd, t.acq_inst_cd AS acqInstCd, b.ISS_INST_NAME AS acqInstName
from T_DTL_YMT t
left join t_bse_pos p on t.sam_id=p.sam_id
left join t_bse_unit u on t.unit_id=u.unit_id
left join T_BSE_ISS_ACQ_CMPT b on b.ACQ_INST_CD = t.ACQ_INST_CD
WHERE 1=1
AND t.txn_Date >= '20230621' AND t.txn_Date <= '20230621' AND t.card_no in ( '3105170080004518536' )
union all
select sys_sett_date sysDatee,dtl_seq seq, t.spec_sys_Sett_Date AS sysSettDate, t.txn_type AS txnType, t.txn_St AS txnSt, t.sett_date AS settDate, t.unit_id AS unitId, u.unit_sname unitName, t.pos_id AS posId, t.sam_id AS samId,p.pos_name posName, t.card_no AS cardNo, t.txn_date AS txnDate, t.txn_time AS txnTime,t.txn_amt AS txnAmt, t.org_amt as orgAmt,t.spec_seq as cenSeq,
txn_type||txn_St||'-'||(select dsp from t_par_txn_type_st where txn_type=t.txn_type and txn_st=t.txn_st) as txnDsp,
(select b.UP_LINE_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) upLineId ,
(select b.dn_LINE_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) dnLineId,
(select b.UP_time from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) upDttm ,
(select b.UP_STAT_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) upStatId , '' upStatName ,
(select b.dn_STAT_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) dnStatId, '' dnStatName ,
(select b.UP_BUS_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date and B.CEN_SEQ=t.spec_seq ) upBusId, t.err_cd AS errCd, t.acq_inst_cd AS acqInstCd, b.ISS_INST_NAME AS acqInstName
from T_DTL_CLOUD_CARD_DTL t
left join t_bse_pos p on t.sam_id=p.sam_id
left join t_bse_unit u on t.unit_id=u.unit_id
left join T_BSE_ISS_ACQ_CMPT b on b.ACQ_INST_CD = t.ACQ_INST_CD
WHERE 1=1
AND t.txn_Date >= '20230621' AND t.txn_Date <= '20230621' AND t.card_no in ( '3105170080004518536' ) )
ORDER BY cardNo asc,txnDate asc, txnTime asc offset 0 rows fetch next 20 rows only;
3.2 原始sql语句执行计划:
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=248337323.33..248337323.36 rows=15 width=567) (actual time=398722.449..398722.481 rows=4 loops=1)
-> Sort (cost=248337323.33..248337323.36 rows=15 width=567) (actual time=398722.446..398722.476 rows=4 loops=1)
Sort Key: t.card_no, t.txn_date, t.txn_time
Sort Method: quicksort Memory: 26kB
-> Append (cost=0.99..248337323.03 rows=15 width=565) (actual time=101491.712..398722.415 rows=4 loops=1)
-> Nested Loop Left Join (cost=0.99..41413968.65 rows=1 width=721) (actual time=101491.711..398721.796 rows=4 loops=1)
Join Filter: ((b.acq_inst_cd)::text = (t.acq_inst_cd)::text)
Rows Removed by Join Filter: 1728
-> Nested Loop Left Join (cost=0.99..1863.81 rows=1 width=269) (actual time=0.545..1.012 rows=4 loops=1)
Join Filter: ((t.unit_id)::text = (u.unit_id)::text)
Rows Removed by Join Filter: 1532
-> Nested Loop Left Join (cost=0.99..1838.64 rows=1 width=248) (actual time=0.318..0.432 rows=4 loops=1)
-> Index Scan using idx_t_dtl_ymt_cardno_f2cf54bf on t_dtl_ymt t (cost=0.57..1822.18 rows=1 width=224) (actual time=0.305..0.385 rows=4 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
Rows Removed by Filter: 57
-> Index Scan using pk_t_bse_pos_5bc5f933 on t_bse_pos p (cost=0.42..8.44 rows=1 width=37) (actual time=0.002..0.002 rows=0 loops=4)
Index Cond: ((sam_id)::text = (t.sam_id)::text)
-> Seq Scan on t_bse_unit u (cost=0.00..18.41 rows=541 width=29) (actual time=0.009..0.080 rows=384 loops=4)
-> Seq Scan on t_bse_iss_acq_cmpt b (cost=0.00..9.33 rows=433 width=27) (actual time=0.006..0.074 rows=433 loops=4)
SubPlan 1
-> Seq Scan on t_par_txn_type_st (cost=0.00..7.05 rows=1 width=20) (actual time=0.030..0.061 rows=1 loops=4)
Filter: ((txn_type = t.txn_type) AND (txn_st = t.txn_st))
Rows Removed by Filter: 269
SubPlan 2
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_2 (cost=0.57..5916011.86 rows=1 width=3) (actual time=14266.232..14266.232 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 3
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_3 (cost=0.57..5916011.86 rows=1 width=3) (actual time=14252.017..14252.017 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 4
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_4 (cost=0.57..5916011.86 rows=1 width=15) (actual time=14206.960..14206.960 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 5
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_5 (cost=0.57..5916011.86 rows=1 width=2) (actual time=14092.144..14092.144 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 6
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_6 (cost=0.57..5916011.86 rows=1 width=19) (actual time=14296.261..14296.261 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 7
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_7 (cost=0.57..5916011.86 rows=1 width=3) (actual time=14315.098..14315.098 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 8
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_8 (cost=0.57..5916011.86 rows=1 width=19) (actual time=14251.160..14251.161 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
-> Hash Left Join (cost=40.90..206923354.16 rows=14 width=533) (actual time=0.599..0.612 rows=0 loops=1)
Hash Cond: ((t_1.acq_inst_cd)::text = (b_1.acq_inst_cd)::text)
-> Hash Left Join (cost=26.15..3159.19 rows=14 width=227) (actual time=0.596..0.604 rows=0 loops=1)
Hash Cond: ((t_1.unit_id)::text = (u_1.unit_id)::text)
-> Nested Loop Left Join (cost=0.98..3133.98 rows=14 width=206) (actual time=0.594..0.599 rows=0 loops=1)
-> Append (cost=0.56..3015.85 rows=14 width=181) (actual time=0.592..0.595 rows=0 loops=1)
-> Index Scan using t_dtl_cloud_card_dtl_p001_card_no_idx on t_dtl_cloud_card_dtl_p001 t_1 (cost=0.56..239.49 rows=1 width=141) (actual time=0.051..0.052 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p002_card_no_idx on t_dtl_cloud_card_dtl_p002 t_2 (cost=0.56..227.60 rows=1 width=141) (actual time=0.043..0.043 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p003_card_no_idx on t_dtl_cloud_card_dtl_p003 t_3 (cost=0.56..224.85 rows=1 width=141) (actual time=0.042..0.042 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p004_card_no_idx on t_dtl_cloud_card_dtl_p004 t_4 (cost=0.56..229.65 rows=1 width=141) (actual time=0.038..0.038 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p005_card_no_idx on t_dtl_cloud_card_dtl_p005 t_5 (cost=0.56..253.06 rows=1 width=141) (actual time=0.039..0.039 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p006_card_no_idx on t_dtl_cloud_card_dtl_p006 t_6 (cost=0.56..246.06 rows=1 width=198) (actual time=0.048..0.048 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p007_card_no_idx on t_dtl_cloud_card_dtl_p007 t_7 (cost=0.56..231.29 rows=1 width=198) (actual time=0.047..0.047 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p008_card_no_idx on t_dtl_cloud_card_dtl_p008 t_8 (cost=0.56..229.59 rows=1 width=141) (actual time=0.042..0.042 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p009_card_no_idx on t_dtl_cloud_card_dtl_p009 t_9 (cost=0.56..251.06 rows=1 width=141) (actual time=0.042..0.042 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p010_card_no_idx on t_dtl_cloud_card_dtl_p010 t_10 (cost=0.56..199.10 rows=1 width=141) (actual time=0.045..0.045 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p011_card_no_idx on t_dtl_cloud_card_dtl_p011 t_11 (cost=0.56..216.61 rows=1 width=141) (actual time=0.041..0.042 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p012_card_no_idx on t_dtl_cloud_card_dtl_p012 t_12 (cost=0.56..240.01 rows=1 width=141) (actual time=0.041..0.042 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p013_card_no_idx on t_dtl_cloud_card_dtl_p013 t_13 (cost=0.56..219.27 rows=1 width=141) (actual time=0.045..0.045 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_default_card_no_idx on t_dtl_cloud_card_dtl_default t_14 (cost=0.14..8.16 rows=1 width=586) (actual time=0.017..0.017 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using pk_t_bse_pos_5bc5f933 on t_bse_pos p_1 (cost=0.42..8.44 rows=1 width=37) (never executed)
Index Cond: ((sam_id)::text = (t_1.sam_id)::text)
-> Hash (cost=18.41..18.41 rows=541 width=29) (never executed)
-> Seq Scan on t_bse_unit u_1 (cost=0.00..18.41 rows=541 width=29) (never executed)
-> Hash (cost=9.33..9.33 rows=433 width=27) (never executed)
-> Seq Scan on t_bse_iss_acq_cmpt b_1 (cost=0.00..9.33 rows=433 width=27) (never executed)
SubPlan 9
-> Seq Scan on t_par_txn_type_st t_par_txn_type_st_1 (cost=0.00..7.05 rows=1 width=20) (never executed)
Filter: ((txn_type = t_1.txn_type) AND (txn_st = t_1.txn_st))
SubPlan 10
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_9 (cost=0.57..2463334.30 rows=1 width=5) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
SubPlan 11
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_10 (cost=0.57..2463334.30 rows=1 width=5) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
SubPlan 12
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_11 (cost=0.57..2463334.30 rows=1 width=15) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
SubPlan 13
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_12 (cost=0.57..2463334.30 rows=1 width=2) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
SubPlan 14
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_13 (cost=0.57..2463334.30 rows=1 width=2) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
SubPlan 15
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_14 (cost=0.57..2463334.30 rows=1 width=9) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
Planning Time: 87.307 ms
Execution Time: 398723.048 ms
四、问题定位:
通过原始的执行计划,查询99%时间都耗费在t_spec_ymt表关联查询,总共关联查询7次,每个关联需要loops 4次
--计算查询大概耗费时间,由于成本因子差异,导致计算结果可能不是十分的精确。此计算只是大概值
--SubPlan 2 (14266.232*4)+ SubPlan 3(14252.017*4)+ SubPlan 4(14206.960*4)+ SubPlan 5(14092.144*4*4)+ SubPlan 6(14296.261*4)+ SubPlan 7(14315.098*4)+ SubPlan 8(14251.161*4)= 398719.492ms
SubPlan 2
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_2 (cost=0.57..5916011.86 rows=1 width=3) (actual time=14266.232..14266.232 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 3
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_3 (cost=0.57..5916011.86 rows=1 width=3) (actual time=14252.017..14252.017 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 4
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_4 (cost=0.57..5916011.86 rows=1 width=15) (actual time=14206.960..14206.960 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 5
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_5 (cost=0.57..5916011.86 rows=1 width=2) (actual time=14092.144..14092.144 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 6
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_6 (cost=0.57..5916011.86 rows=1 width=19) (actual time=14296.261..14296.261 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 7
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_7 (cost=0.57..5916011.86 rows=1 width=3) (actual time=14315.098..14315.098 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 8
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_8 (cost=0.57..5916011.86 rows=1 width=19) (actual time=14251.160..14251.161 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
五、问题分析:
5.1 执行计划分析:
T_SPEC_YMT表查询有使用索引扫描Index Scan using pk_t_spec_ymt_b490c786,pk_t_spec_ymt_b490c786索引是对表添加主键后自动创建的唯一索引,此索引使用sys_sett_date, cen_seq字段。
T_SPEC_YMT表sys_sett_date字段类型为character(8 char)也就是char(8),cen_seq字段类型为character varying(10 char)也就是varchar(10)。
T_DTL_YMT表spec_sys_sett_date字段类型为character varying(8 char)也就是varchar(8),spec_seq字段类型为character varying(12 char)也就是varchar(12)。
T_DTL_YMT T表关联T_SPEC_YMT B表查询:
关联条件 WHERE B.SYS_SETT_DATE=T.SPEC_SYS_SETT_DATE AND B.CEN_SEQ=T.SPEC_SEQ
B.SYS_SETT_DATE字段类型char(8),T.SPEC_SYS_SETT_DATE字段类型varchar(8)
B.CEN_SEQ字段类型varchar(10),T.SPEC_SEQ字段类型varchar(12)
5.2 表信息分析:
关联条件字段类型、长度不一致。数据类型、长度的差异会导致数据发生隐氏转换,同时B.SYS_SETT_DATE字段恰好又是联合索引的第一列,隐氏转换后无法用到组合索引的全部索引列,导致查询效率变慢。
举例:
上图是个两列索引,btree索引是按照第一列去排序并存储。发生隐式转换导致第一列(排序列)失效,不能使用索引。用第二列的话实际比全表扫描seqscan还慢。
六、问题解决:
定位到查询慢的原因解决问题就可以很好的解决问题。
方法1:强制关联字段不发生隐氏转换
WHERE B.SYS_SETT_DATE=T.SPEC_SYS_SETT_DATE::CHAR(8) AND B.CEN_SEQ=T.SPEC_SEQ
通过以上方法修改之后,查询就可以正常使用到T_SPEC_YMT表pk_t_spec_ymt_b490c786索引。
修改之后的查询语句:
select * from (
select sys_sett_date sysDatee,cen_seq seq, t.spec_sys_Sett_Date AS sysSettDate, t.txn_type AS txnType, t.txn_St AS txnSt, t.sett_date AS settDate, t.unit_id AS unitId, u.unit_sname unitName, t.pos_id AS posId, t.sam_id AS samId,p.pos_name posName, t.card_no AS cardNo, t.txn_date AS txnDate, t.txn_time AS txnTime,t.txn_amt AS txnAmt, t.org_amt as orgAmt,t.spec_seq as cenSeq,
txn_type||txn_St||'-'||(select dsp from t_par_txn_type_st where txn_type=t.txn_type and txn_st=t.txn_st) as txnDsp,
(select b.UP_LINE_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) upLineId ,
(select b.dn_LINE_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) dnLineId,
(select b.UP_time from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) upDttm ,
(select b.UP_STAT_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) upStatId ,
(select b.UP_STAT_NAME from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) upStatName ,
(select b.dn_STAT_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) dnStatId,
(select b.DN_STAT_NAME from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) dnStatName , '' upBusId, t.err_cd AS errCd, t.acq_inst_cd AS acqInstCd, b.ISS_INST_NAME AS acqInstName
from T_DTL_YMT t
left join t_bse_pos p on t.sam_id=p.sam_id
left join t_bse_unit u on t.unit_id=u.unit_id
left join T_BSE_ISS_ACQ_CMPT b on b.ACQ_INST_CD = t.ACQ_INST_CD
WHERE 1=1
AND t.txn_Date >= '20230621' AND t.txn_Date <= '20230621' AND t.card_no in ( '3105170080004518536' )
union all
select sys_sett_date sysDatee,dtl_seq seq, t.spec_sys_Sett_Date AS sysSettDate, t.txn_type AS txnType, t.txn_St AS txnSt, t.sett_date AS settDate, t.unit_id AS unitId, u.unit_sname unitName, t.pos_id AS posId, t.sam_id AS samId,p.pos_name posName, t.card_no AS cardNo, t.txn_date AS txnDate, t.txn_time AS txnTime,t.txn_amt AS txnAmt, t.org_amt as orgAmt,t.spec_seq as cenSeq,
txn_type||txn_St||'-'||(select dsp from t_par_txn_type_st where txn_type=t.txn_type and txn_st=t.txn_st) as txnDsp,
(select b.UP_LINE_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) upLineId ,
(select b.dn_LINE_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) dnLineId,
(select b.UP_time from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) upDttm ,
(select b.UP_STAT_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) upStatId , '' upStatName ,
(select b.dn_STAT_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) dnStatId, '' dnStatName ,
(select b.UP_BUS_ID from T_SPEC_YMT b where b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq) upBusId, t.err_cd AS errCd, t.acq_inst_cd AS acqInstCd, b.ISS_INST_NAME AS acqInstName
from T_DTL_CLOUD_CARD_DTL t
left join t_bse_pos p on t.sam_id=p.sam_id
left join t_bse_unit u on t.unit_id=u.unit_id
left join T_BSE_ISS_ACQ_CMPT b on b.ACQ_INST_CD = t.ACQ_INST_CD
WHERE 1=1
AND t.txn_Date >= '20230621' AND t.txn_Date <= '20230621' AND t.card_no in ( '3105170080004518536' ) )
ORDER BY cardNo asc,txnDate asc, txnTime asc offset 0 rows fetch next 20 rows only;
修改后的执行计划:
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=5941.02..5941.06 rows=15 width=567) (actual time=3.120..3.133 rows=4 loops=1)
-> Sort (cost=5941.02..5941.06 rows=15 width=567) (actual time=3.116..3.129 rows=4 loops=1)
Sort Key: t.card_no, t.txn_date, t.txn_time
Sort Method: quicksort Memory: 26kB
-> Append (cost=0.99..5940.73 rows=15 width=565) (actual time=0.959..3.091 rows=4 loops=1)
-> Nested Loop Left Join (cost=0.99..1945.77 rows=1 width=721) (actual time=0.958..2.309 rows=4 loops=1)
Join Filter: ((b.acq_inst_cd)::text = (t.acq_inst_cd)::text)
Rows Removed by Join Filter: 1728
-> Nested Loop Left Join (cost=0.99..1863.81 rows=1 width=269) (actual time=0.505..0.925 rows=4 loops=1)
Join Filter: ((t.unit_id)::text = (u.unit_id)::text)
Rows Removed by Join Filter: 1532
-> Nested Loop Left Join (cost=0.99..1838.64 rows=1 width=248) (actual time=0.305..0.382 rows=4 loops=1)
-> Index Scan using idx_t_dtl_ymt_cardno_f2cf54bf on t_dtl_ymt t (cost=0.57..1822.18 rows=1 width=224) (actual time=0.290..0.360 rows=4 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
Rows Removed by Filter: 57
-> Index Scan using pk_t_bse_pos_5bc5f933 on t_bse_pos p (cost=0.42..8.44 rows=1 width=37) (actual time=0.002..0.002 rows=0 loops=4)
Index Cond: ((sam_id)::text = (t.sam_id)::text)
-> Seq Scan on t_bse_unit u (cost=0.00..18.41 rows=541 width=29) (actual time=0.006..0.070 rows=384 loops=4)
-> Seq Scan on t_bse_iss_acq_cmpt b (cost=0.00..9.33 rows=433 width=27) (actual time=0.006..0.066 rows=433 loops=4)
SubPlan 1
-> Seq Scan on t_par_txn_type_st (cost=0.00..7.05 rows=1 width=20) (actual time=0.027..0.057 rows=1 loops=4)
Filter: ((txn_type = t.txn_type) AND (txn_st = t.txn_st))
Rows Removed by Filter: 269
SubPlan 2
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_2 (cost=0.57..8.59 rows=1 width=3) (actual time=0.025..0.025 rows=0 loops=4)
Index Cond: ((sys_sett_date = (t.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t.spec_seq)::text))
SubPlan 3
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_3 (cost=0.57..8.59 rows=1 width=3) (actual time=0.019..0.019 rows=0 loops=4)
Index Cond: ((sys_sett_date = (t.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t.spec_seq)::text))
SubPlan 4
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_4 (cost=0.57..8.59 rows=1 width=15) (actual time=0.017..0.017 rows=0 loops=4)
Index Cond: ((sys_sett_date = (t.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t.spec_seq)::text))
SubPlan 5
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_5 (cost=0.57..8.59 rows=1 width=2) (actual time=0.017..0.018 rows=0 loops=4)
Index Cond: ((sys_sett_date = (t.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t.spec_seq)::text))
SubPlan 6
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_6 (cost=0.57..8.59 rows=1 width=19) (actual time=0.018..0.018 rows=0 loops=4)
Index Cond: ((sys_sett_date = (t.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t.spec_seq)::text))
SubPlan 7
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_7 (cost=0.57..8.59 rows=1 width=3) (actual time=0.017..0.017 rows=0 loops=4)
Index Cond: ((sys_sett_date = (t.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t.spec_seq)::text))
SubPlan 8
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_8 (cost=0.57..8.59 rows=1 width=19) (actual time=0.017..0.017 rows=0 loops=4)
Index Cond: ((sys_sett_date = (t.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t.spec_seq)::text))
-> Hash Left Join (cost=40.90..3994.73 rows=14 width=533) (actual time=0.772..0.779 rows=0 loops=1)
Hash Cond: ((t_1.acq_inst_cd)::text = (b_1.acq_inst_cd)::text)
-> Hash Left Join (cost=26.15..3159.19 rows=14 width=227) (actual time=0.771..0.776 rows=0 loops=1)
Hash Cond: ((t_1.unit_id)::text = (u_1.unit_id)::text)
-> Nested Loop Left Join (cost=0.98..3133.98 rows=14 width=206) (actual time=0.770..0.773 rows=0 loops=1)
-> Append (cost=0.56..3015.85 rows=14 width=181) (actual time=0.769..0.772 rows=0 loops=1)
-> Index Scan using t_dtl_cloud_card_dtl_p001_card_no_idx on t_dtl_cloud_card_dtl_p001 t_1 (cost=0.56..239.49 rows=1 width=141) (actual time=0.062..0.062 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p002_card_no_idx on t_dtl_cloud_card_dtl_p002 t_2 (cost=0.56..227.60 rows=1 width=141) (actual time=0.064..0.064 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p003_card_no_idx on t_dtl_cloud_card_dtl_p003 t_3 (cost=0.56..224.85 rows=1 width=141) (actual time=0.060..0.060 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p004_card_no_idx on t_dtl_cloud_card_dtl_p004 t_4 (cost=0.56..229.65 rows=1 width=141) (actual time=0.058..0.058 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p005_card_no_idx on t_dtl_cloud_card_dtl_p005 t_5 (cost=0.56..253.06 rows=1 width=141) (actual time=0.052..0.052 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p006_card_no_idx on t_dtl_cloud_card_dtl_p006 t_6 (cost=0.56..246.06 rows=1 width=198) (actual time=0.057..0.057 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p007_card_no_idx on t_dtl_cloud_card_dtl_p007 t_7 (cost=0.56..231.29 rows=1 width=198) (actual time=0.058..0.058 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p008_card_no_idx on t_dtl_cloud_card_dtl_p008 t_8 (cost=0.56..229.59 rows=1 width=141) (actual time=0.057..0.057 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p009_card_no_idx on t_dtl_cloud_card_dtl_p009 t_9 (cost=0.56..251.06 rows=1 width=141) (actual time=0.052..0.052 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p010_card_no_idx on t_dtl_cloud_card_dtl_p010 t_10 (cost=0.56..199.10 rows=1 width=141) (actual time=0.057..0.057 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p011_card_no_idx on t_dtl_cloud_card_dtl_p011 t_11 (cost=0.56..216.61 rows=1 width=141) (actual time=0.059..0.059 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p012_card_no_idx on t_dtl_cloud_card_dtl_p012 t_12 (cost=0.56..240.01 rows=1 width=141) (actual time=0.061..0.061 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p013_card_no_idx on t_dtl_cloud_card_dtl_p013 t_13 (cost=0.56..219.27 rows=1 width=141) (actual time=0.058..0.058 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_default_card_no_idx on t_dtl_cloud_card_dtl_default t_14 (cost=0.14..8.16 rows=1 width=586) (actual time=0.010..0.010 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using pk_t_bse_pos_5bc5f933 on t_bse_pos p_1 (cost=0.42..8.44 rows=1 width=37) (never executed)
Index Cond: ((sam_id)::text = (t_1.sam_id)::text)
-> Hash (cost=18.41..18.41 rows=541 width=29) (never executed)
-> Seq Scan on t_bse_unit u_1 (cost=0.00..18.41 rows=541 width=29) (never executed)
-> Hash (cost=9.33..9.33 rows=433 width=27) (never executed)
-> Seq Scan on t_bse_iss_acq_cmpt b_1 (cost=0.00..9.33 rows=433 width=27) (never executed)
SubPlan 9
-> Seq Scan on t_par_txn_type_st t_par_txn_type_st_1 (cost=0.00..7.05 rows=1 width=20) (never executed)
Filter: ((txn_type = t_1.txn_type) AND (txn_st = t_1.txn_st))
SubPlan 10
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_9 (cost=0.57..8.59 rows=1 width=5) (never executed)
Index Cond: ((sys_sett_date = (t_1.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t_1.spec_seq)::character(8 char))::text))
SubPlan 11
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_10 (cost=0.57..8.59 rows=1 width=5) (never executed)
Index Cond: ((sys_sett_date = (t_1.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t_1.spec_seq)::character(8 char))::text))
SubPlan 12
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_11 (cost=0.57..8.59 rows=1 width=15) (never executed)
Index Cond: ((sys_sett_date = (t_1.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t_1.spec_seq)::character(8 char))::text))
SubPlan 13
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_12 (cost=0.57..8.59 rows=1 width=2) (never executed)
Index Cond: ((sys_sett_date = (t_1.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t_1.spec_seq)::character(8 char))::text))
SubPlan 14
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_13 (cost=0.57..8.59 rows=1 width=2) (never executed)
Index Cond: ((sys_sett_date = (t_1.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t_1.spec_seq)::character(8 char))::text))
SubPlan 15
-> Index Scan using pk_T_SPEC_YMT_d3a0142e on T_SPEC_YMT b_14 (cost=0.57..8.59 rows=1 width=9) (never executed)
Index Cond: ((sys_sett_date = (t_1.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = ((t_1.spec_seq)::character(8 char))::text))
Planning Time: 8.099 ms
Execution Time: 3.742 ms
(122 行记录)
此方法在应用不方便修改查询语句、不能修改表结构时可以结合Query mapping使用。
方法2:修改表结构使关联字段类型保持一致
修改T_DTL_YMT表spec_sys_sett_date字段类型为char(8),或者修改T_SPEC_YMT表sys_sett_date字段类型为varchar(8)。使关联条件不发生隐氏转换。
alter table T_DTL_YMT alter spec_sys_sett_date type char(8);
alter table T_SPEC_YMT alter sys_sett_date type varchar(8);
由于客户坚决不同意进行表结构变更,此方法不能使用。
方法3:重新新建索引,并调整索引字段顺序
通过问题分析-表信息分析,btree索引是按照第一列去排序并存储。发生隐式转换导致第一列(排序列)失效,不能使用索引。通过将索引字段列顺序调整解决问题。
create index concurrently idx_name on T_SPEC_YMT(cen_seq,sys_sett_date);
再次执行原查询语句执行计划:
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=1627.43..1627.47 rows=15 width=607) (actual time=57.858..57.907 rows=4 loops=1)
-> Sort (cost=1627.43..1627.47 rows=15 width=607) (actual time=57.855..57.901 rows=4 loops=1)
Sort Key: t.card_no, t.txn_date, t.txn_time
Sort Method: quicksort Memory: 26kB
-> Append (cost=1.27..1627.14 rows=15 width=605) (actual time=22.099..57.624 rows=4 loops=1)
-> Nested Loop Left Join (cost=1.27..531.13 rows=1 width=721) (actual time=22.097..41.507 rows=4 loops=1)
Join Filter: ((b.acq_inst_cd)::text = (t.acq_inst_cd)::text)
Rows Removed by Join Filter: 1728
-> Nested Loop Left Join (cost=1.27..496.08 rows=1 width=269) (actual time=19.771..35.461 rows=4 loops=1)
-> Nested Loop Left Join (cost=0.99..493.78 rows=1 width=248) (actual time=19.699..35.319 rows=4 loops=1)
-> Index Scan using idx_t_dtl_ymt_cardno_f2cf54bf on t_dtl_ymt t (cost=0.57..489.32 rows=1 width=224) (actual time=19.659..35.251 rows=4 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
Rows Removed by Filter: 78
-> Index Scan using pk_t_bse_pos_5bc5f933 on t_bse_pos p (cost=0.42..2.44 rows=1 width=37) (actual time=0.008..0.008 rows=0 loops=4)
Index Cond: ((sam_id)::text = (t.sam_id)::text)
-> Index Scan using pk_t_bse_unit_9c036540 on t_bse_unit u (cost=0.28..2.29 rows=1 width=29) (actual time=0.029..0.029 rows=1 loops=4)
Index Cond: ((unit_id)::text = (t.unit_id)::text)
-> Seq Scan on t_bse_iss_acq_cmpt b (cost=0.00..9.33 rows=433 width=27) (actual time=0.008..0.081 rows=433 loops=4)
SubPlan 1
-> Index Scan using pk_t_par_txn_type_st_7cb588ce on t_par_txn_type_st (cost=0.15..2.17 rows=1 width=20) (actual time=0.110..0.112 rows=1 loops=4)
Index Cond: ((txn_type = t.txn_type) AND (txn_st = t.txn_st))
SubPlan 2
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_2 (cost=0.57..2.59 rows=1 width=3) (actual time=0.935..0.935 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date )::text = (t.spec_sys_sett_date)::text)
SubPlan 3
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_3 (cost=0.57..2.59 rows=1 width=3) (actual time=0.046..0.046 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 4
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_4 (cost=0.57..2.59 rows=1 width=15) (actual time=0.038..0.038 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 5
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_5 (cost=0.57..2.59 rows=1 width=2) (actual time=0.031..0.031 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 6
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_6 (cost=0.57..2.59 rows=1 width=19) (actual time=0.031..0.031 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 7
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_7 (cost=0.57..2.59 rows=1 width=3) (actual time=0.029..0.029 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
SubPlan 8
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_8 (cost=0.57..2.59 rows=1 width=19) (actual time=0.025..0.025 rows=0 loops=4)
Index Cond: ((cen_seq)::text = (t.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t.spec_sys_sett_date)::text)
-> Hash Left Join (cost=16.00..1095.79 rows=14 width=609) (actual time=16.084..16.108 rows=0 loops=1)
Hash Cond: ((t_1.acq_inst_cd)::text = (b_1.acq_inst_cd)::text)
-> Nested Loop Left Join (cost=1.26..832.81 rows=14 width=227) (actual time=16.081..16.094 rows=0 loops=1)
-> Nested Loop Left Join (cost=0.98..813.71 rows=14 width=206) (actual time=16.080..16.091 rows=0 loops=1)
-> Append (cost=0.56..779.58 rows=14 width=181) (actual time=16.078..16.089 rows=0 loops=1)
-> Index Scan using t_dtl_cloud_card_dtl_p001_card_no_idx on t_dtl_cloud_card_dtl_p001 t_1 (cost=0.56..61.31 rows=1 width=141) (actual time=1.234..1.235 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p002_card_no_idx on t_dtl_cloud_card_dtl_p002 t_2 (cost=0.56..58.29 rows=1 width=141) (actual time=1.109..1.109 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p003_card_no_idx on t_dtl_cloud_card_dtl_p003 t_3 (cost=0.56..57.57 rows=1 width=141) (actual time=1.128..1.128 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p004_card_no_idx on t_dtl_cloud_card_dtl_p004 t_4 (cost=0.56..58.78 rows=1 width=141) (actual time=1.080..1.081 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p005_card_no_idx on t_dtl_cloud_card_dtl_p005 t_5 (cost=0.56..64.74 rows=1 width=141) (actual time=1.167..1.167 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p006_card_no_idx on t_dtl_cloud_card_dtl_p006 t_6 (cost=0.56..63.01 rows=1 width=198) (actual time=1.194..1.194 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p007_card_no_idx on t_dtl_cloud_card_dtl_p007 t_7 (cost=0.56..59.23 rows=1 width=198) (actual time=1.410..1.410 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p008_card_no_idx on t_dtl_cloud_card_dtl_p008 t_8 (cost=0.56..58.83 rows=1 width=141) (actual time=1.204..1.205 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p009_card_no_idx on t_dtl_cloud_card_dtl_p009 t_9 (cost=0.56..64.33 rows=1 width=141) (actual time=1.522..1.522 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p010_card_no_idx on t_dtl_cloud_card_dtl_p010 t_10 (cost=0.56..52.11 rows=1 width=141) (actual time=1.466..1.466 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p011_card_no_idx on t_dtl_cloud_card_dtl_p011 t_11 (cost=0.56..61.53 rows=1 width=141) (actual time=0.197..0.198 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p012_card_no_idx on t_dtl_cloud_card_dtl_p012 t_12 (cost=0.56..61.44 rows=1 width=141) (actual time=1.836..1.836 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p013_card_no_idx on t_dtl_cloud_card_dtl_p013 t_13 (cost=0.56..56.18 rows=1 width=141) (actual time=1.454..1.454 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_default_card_no_idx on t_dtl_cloud_card_dtl_default t_14 (cost=0.14..2.16 rows=1 width=586) (actual time=0.062..0.062 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using pk_t_bse_pos_5bc5f933 on t_bse_pos p_1 (cost=0.42..2.44 rows=1 width=37) (never executed)
Index Cond: ((sam_id)::text = (t_1.sam_id)::text)
-> Index Scan using pk_t_bse_unit_9c036540 on t_bse_unit u_1 (cost=0.28..1.36 rows=1 width=29) (never executed)
Index Cond: ((unit_id)::text = (t_1.unit_id)::text)
-> Hash (cost=9.33..9.33 rows=433 width=27) (never executed)
-> Seq Scan on t_bse_iss_acq_cmpt b_1 (cost=0.00..9.33 rows=433 width=27) (never executed)
SubPlan 9
-> Index Scan using pk_t_par_txn_type_st_7cb588ce on t_par_txn_type_st t_par_txn_type_st_1 (cost=0.15..2.17 rows=1 width=20) (never executed)
Index Cond: ((txn_type = t_1.txn_type) AND (txn_st = t_1.txn_st))
SubPlan 10
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_9 (cost=0.57..2.59 rows=1 width=3) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
SubPlan 11
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_10 (cost=0.57..2.59 rows=1 width=3) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
SubPlan 12
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_11 (cost=0.57..2.59 rows=1 width=15) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
SubPlan 13
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_12 (cost=0.57..2.59 rows=1 width=2) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
SubPlan 14
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_13 (cost=0.57..2.59 rows=1 width=3) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
SubPlan 15
-> Index Scan using idx_t_spec_ymt_2 on t_spec_ymt b_14 (cost=0.57..2.59 rows=1 width=10) (never executed)
Index Cond: ((cen_seq)::text = (t_1.spec_seq)::text)
Filter: ((sys_sett_date)::text = (t_1.spec_sys_sett_date)::text)
Planning Time: 164.294 ms
Execution Time: 62.390 ms
从原始的398秒到现在的62毫秒。
方法4:修改查询语句减少子查询次数
通过问题定位,查询时间都耗费在t_spec_ymt表关联查询。相同的关联条件,关联t_spec_ymt表7次。实际只关联t_spec_ymt表一次就可以得到想要的结果。
修改后的查询语句:
select * from (
select t.sys_sett_date sysDatee,t.cen_seq seq, t.spec_sys_Sett_Date AS sysSettDate, t.txn_type AS txnType, t.txn_St AS txnSt, t.sett_date AS settDate, t.unit_id AS unitId, u.unit_sname unitName, t.pos_id AS posId, t.sam_id AS samId,p.pos_name posName, t.card_no AS cardNo, t.txn_date AS txnDate, t.txn_time AS txnTime,t.txn_amt AS txnAmt, t.org_amt as orgAmt,t.spec_seq as cenSeq,
t.txn_type||t.txn_St||'-'||tp.dsp txnDsp, b.UP_LINE_ID upLineId , b.dn_LINE_ID dnLineId, b.UP_time upDttm , b.UP_STAT_ID upStatId , b.UP_STAT_NAME upStatName , b.dn_STAT_ID dnStatId, b.DN_STAT_NAME dnStatName , '' upBusId, t.err_cd AS errCd, t.acq_inst_cd AS acqInstCd, tb.ISS_INST_NAME AS acqInstName
from T_DTL_YMT t
left join t_bse_pos p on t.sam_id=p.sam_id
left join t_bse_unit u on t.unit_id=u.unit_id
left join T_BSE_ISS_ACQ_CMPT tb on tb.ACQ_INST_CD = t.ACQ_INST_CD
left join T_SPEC_YMT b on b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq
left join t_par_txn_type_st tp on tp.txn_type=t.txn_type and tp.txn_st=t.txn_st
WHERE 1=1 AND t.txn_Date >= '20230621' AND t.txn_Date <= '20230621' AND t.card_no in ( '3105170080004518536' )
union all
select t.sys_sett_date sysDatee,t.dtl_seq seq, t.spec_sys_Sett_Date AS sysSettDate, t.txn_type AS txnType, t.txn_St AS txnSt, t.sett_date AS settDate, t.unit_id AS unitId, u.unit_sname unitName, t.pos_id AS posId, t.sam_id AS samId,p.pos_name posName, t.card_no AS cardNo, t.txn_date AS txnDate, t.txn_time AS txnTime,t.txn_amt AS txnAmt, t.org_amt as orgAmt,t.spec_seq as cenSeq,
t.txn_type||t.txn_St||'-'||tp.dsp txnDsp, b.UP_LINE_ID upLineId , b.dn_LINE_ID dnLineId, b.UP_time upDttm , b.UP_STAT_ID upStatId , b.UP_STAT_NAME upStatName , b.dn_STAT_ID dnStatId, b.DN_STAT_NAME dnStatName , '' upBusId, t.err_cd AS errCd, t.acq_inst_cd AS acqInstCd, tb.ISS_INST_NAME AS acqInstName
from T_DTL_CLOUD_CARD_DTL t
left join t_bse_pos p on t.sam_id=p.sam_id
left join t_bse_unit u on t.unit_id=u.unit_id
left join T_BSE_ISS_ACQ_CMPT tb on tb.ACQ_INST_CD = t.ACQ_INST_CD
left join T_SPEC_YMT b on b.sys_sett_date=t.spec_sys_sett_date::char(8) and B.CEN_SEQ=t.spec_seq
left join t_par_txn_type_st tp on tp.txn_type=t.txn_type and tp.txn_st=t.txn_st
WHERE 1=1
AND t.txn_Date >= '20230621' AND t.txn_Date <= '20230621' AND t.card_no in ( '3105170080004518536' ) )
ORDER BY cardNo asc,txnDate asc, txnTime asc offset 0 rows fetch next 20 rows only ;
执行计划:
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=5214.33..5214.37 rows=15 width=393) (actual time=2.570..2.581 rows=4 loops=1)
-> Sort (cost=5214.33..5214.37 rows=15 width=393) (actual time=2.568..2.578 rows=4 loops=1)
Sort Key: t.card_no, t.txn_date, t.txn_time
Sort Method: quicksort Memory: 26kB
-> Append (cost=1.56..5214.04 rows=15 width=391) (actual time=0.781..2.549 rows=4 loops=1)
-> Nested Loop Left Join (cost=1.56..1896.90 rows=1 width=415) (actual time=0.780..1.766 rows=4 loops=1)
Join Filter: ((tp.txn_type = t.txn_type) AND (tp.txn_st = t.txn_st))
Rows Removed by Join Filter: 496
-> Nested Loop Left Join (cost=1.56..1887.14 rows=1 width=351) (actual time=0.720..1.597 rows=4 loops=1)
-> Nested Loop Left Join (cost=0.99..1878.55 rows=1 width=287) (actual time=0.665..1.491 rows=4 loops=1)
Join Filter: ((tb.acq_inst_cd)::text = (t.acq_inst_cd)::text)
Rows Removed by Join Filter: 1728
-> Nested Loop Left Join (cost=0.99..1863.81 rows=1 width=269) (actual time=0.537..0.955 rows=4 loops=1)
Join Filter: ((t.unit_id)::text = (u.unit_id)::text)
Rows Removed by Join Filter: 1532
-> Nested Loop Left Join (cost=0.99..1838.64 rows=1 width=248) (actual time=0.327..0.426 rows=4loops=1)
-> Index Scan using idx_t_dtl_ymt_cardno_f2cf54bf on t_dtl_ymt t (cost=0.57..1822.18 rows=1 width=224) (actual time=0.315..0.407 rows=4 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
Rows Removed by Filter: 57
-> Index Scan using pk_t_bse_pos_5bc5f933 on t_bse_pos p (cost=0.42..8.44 rows=1 width=37) (actual time=0.002..0.002 rows=0 loops=4)
Index Cond: ((sam_id)::text = (t.sam_id)::text)
-> Seq Scan on t_bse_unit u (cost=0.00..18.41 rows=541 width=29) (actual time=0.005..0.071 rows=384 loops=4)
-> Seq Scan on t_bse_iss_acq_cmpt tb (cost=0.00..9.33 rows=433 width=27) (actual time=0.006..0.063 rows=433 loops=4)
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b (cost=0.57..8.59 rows=1 width=84) (actual time=0.024..0.024 rows=0 loops=4)
Index Cond: ((sys_sett_date = (t.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = (t.spec_seq)::text))
-> Seq Scan on t_par_txn_type_st tp (cost=0.00..5.70 rows=270 width=26) (actual time=0.007..0.017 rows=125 loops=4)
-> Nested Loop Left Join (cost=41.62..3316.91 rows=14 width=389) (actual time=0.774..0.780 rows=0 loops=1)
-> Nested Loop Left Join (cost=41.47..3294.42 rows=14 width=309) (actual time=0.774..0.780 rows=0 loops=1)
-> Hash Left Join (cost=40.90..3174.12 rows=14 width=245) (actual time=0.774..0.779 rows=0 loops=1)
Hash Cond: ((t_1.acq_inst_cd)::text = (tb_1.acq_inst_cd)::text)
-> Hash Left Join (cost=26.15..3159.19 rows=14 width=227) (actual time=0.773..0.778 rows=0 loops=1)
Hash Cond: ((t_1.unit_id)::text = (u_1.unit_id)::text)
-> Nested Loop Left Join (cost=0.98..3133.98 rows=14 width=206) (actual time=0.772..0.776 rows=0 loops=1)
-> Append (cost=0.56..3015.85 rows=14 width=181) (actual time=0.772..0.775 rows=0 loops=1)
-> Index Scan using t_dtl_cloud_card_dtl_p001_card_no_idx on t_dtl_cloud_card_dtl_p001 t_1 (cost=0.56..239.49 rows=1 width=141) (actual time=0.065..0.065 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p002_card_no_idx on t_dtl_cloud_card_dtl_p002 t_2 (cost=0.56..227.60 rows=1 width=141) (actual time=0.065..0.065 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p003_card_no_idx on t_dtl_cloud_card_dtl_p003 t_3 (cost=0.56..224.85 rows=1 width=141) (actual time=0.059..0.059 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p004_card_no_idx on t_dtl_cloud_card_dtl_p004 t_4 (cost=0.56..229.65 rows=1 width=141) (actual time=0.057..0.057 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p005_card_no_idx on t_dtl_cloud_card_dtl_p005 t_5 (cost=0.56..253.06 rows=1 width=141) (actual time=0.052..0.052 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p006_card_no_idx on t_dtl_cloud_card_dtl_p006 t_6 (cost=0.56..246.06 rows=1 width=198) (actual time=0.053..0.053 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p007_card_no_idx on t_dtl_cloud_card_dtl_p007 t_7 (cost=0.56..231.29 rows=1 width=198) (actual time=0.059..0.059 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p008_card_no_idx on t_dtl_cloud_card_dtl_p008 t_8 (cost=0.56..229.59 rows=1 width=141) (actual time=0.058..0.058 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p009_card_no_idx on t_dtl_cloud_card_dtl_p009 t_9 (cost=0.56..251.06 rows=1 width=141) (actual time=0.053..0.054 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p010_card_no_idx on t_dtl_cloud_card_dtl_p010 t_10 (cost=0.56..199.10 rows=1 width=141) (actual time=0.058..0.059 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p011_card_no_idx on t_dtl_cloud_card_dtl_p011 t_11 (cost=0.56..216.61 rows=1 width=141) (actual time=0.057..0.057 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p012_card_no_idx on t_dtl_cloud_card_dtl_p012 t_12 (cost=0.56..240.01 rows=1 width=141) (actual time=0.061..0.061 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_p013_card_no_idx on t_dtl_cloud_card_dtl_p013 t_13 (cost=0.56..219.27 rows=1 width=141) (actual time=0.056..0.056 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using t_dtl_cloud_card_dtl_default_card_no_idx on t_dtl_cloud_card_dtl_default t_14 (cost=0.14..8.16 rows=1 width=586) (actual time=0.015..0.015 rows=0 loops=1)
Index Cond: ((card_no)::text = '3105170080004518536'::text)
Filter: ((txn_date >= '20230621'::bpchar) AND (txn_date <= '20230621'::bpchar))
-> Index Scan using pk_t_bse_pos_5bc5f933 on t_bse_pos p_1 (cost=0.42..8.44 rows=1 width=37) (never executed)
Index Cond: ((sam_id)::text = (t_1.sam_id)::text)
-> Hash (cost=18.41..18.41 rows=541 width=29) (never executed)
-> Seq Scan on t_bse_unit u_1 (cost=0.00..18.41 rows=541 width=29) (never executed)
-> Hash (cost=9.33..9.33 rows=433 width=27) (never executed)
-> Seq Scan on t_bse_iss_acq_cmpt tb_1 (cost=0.00..9.33 rows=433 width=27) (never executed)
-> Index Scan using pk_t_spec_ymt_b490c786 on t_spec_ymt b_1 (cost=0.57..8.59 rows=1 width=84) (never executed)
Index Cond: ((sys_sett_date = (t_1.spec_sys_sett_date)::character(8 char)) AND ((cen_seq)::text = (t_1.spec_seq)::text))
-> Index Scan using pk_t_par_txn_type_st_7cb588ce on t_par_txn_type_st tp_1 (cost=0.15..1.60 rows=1 width=26) (never executed)
Index Cond: ((txn_type = t_1.txn_type) AND (txn_st = t_1.txn_st))
Planning Time: 12.140 ms
Execution Time: 3.093 ms
(89 行记录)
七、优化案例总结:
在关联字段上创建索引,提高查询性能。
在关联条件上使用相同的数据类型和函数,避免隐式转换或函数调用导致的性能问题。
KingbaseES数据库-生产环境慢查询性能优化案例的更多相关文章
- Sql Server查询性能优化之走出索引的误区
据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...
- 高性能mysql 第六章查询性能优化 总结(上)查询的执行过程
6 查询性能优化 6.1为什么查询会变慢 这里说明了的查询执行周期,从客户端到服务器端,服务器端解析,优化器生成执行计划,执行(可以细分,大体过程可以通过show profile查看),从服务器端返 ...
- SQL SERVER 查询性能优化——分析事务与锁(五)
SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...
- mysql笔记03 查询性能优化
查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...
- SQL Server查询性能优化——堆表、碎片与索引(二)
本文是对 SQL Server查询性能优化——堆表.碎片与索引(一)的一些总结. 第一:先对 SQL Server查询性能优化——堆表.碎片与索引(一)中的例一的SET STATISTICS IO之 ...
- SQL Server查询性能优化——覆盖索引(二)
在SQL Server 查询性能优化——覆盖索引(一)中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索引等 ...
- MySQL查询性能优化(精)
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- SQl语句查询性能优化
[摘要]本文从DBMS的查询优化器对SQL查询语句进行性能优化的角度出发,结合数据库理论,从查询表达式及其多种查询条件组合对数据库查询性能优化进行分析,总结出多种提高数据库查询性能优化策略,介绍索引的 ...
- 170727、MySQL查询性能优化
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- Django的model查询操作 与 查询性能优化
Django的model查询操作 与 查询性能优化 1 如何 在做ORM查询时 查看SQl的执行情况 (1) 最底层的 django.db.connection 在 django shell 中使用 ...
随机推荐
- cmp命令
cmp命令 cmp命令用来比较两个文件是否有差异,当相互比较的两个文件完全一样时,则该指令不会输出任何信息,若发现有差异,预设会标示出第一个不同之处的字符和列数编号,若不指定任何文件名称或是所给予的文 ...
- 解决iso方式安装win10找不到固态硬盘!!!
问题说明 朋友的一台联想小新笔记本需要安装win10,我给弄了个iso启动U盘,但是在选择安装盘时找不到笔记本的固态硬盘... 问题原因 联想的锅! 以联想为例,出厂系统的BIOS内,SATA Con ...
- Java序列化(Serializable)与反序列化详解
什么是序列化? Java序列化是在JDK 1.1中引入的,是Java内核的重要特性之一. Java序列化API允许我们将一个对象转换为流,并通过网络发送,或将其存入文件或数据库以便未来使用, 反序列化 ...
- 【LeetCode哈希表#4】梦开始的地方:两数之和(map),以及关于容器map的一些代码技巧
两数之和 力扣题目链接(opens new window) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种 ...
- 【Azure 应用服务】如何禁止chinacloudsites.cn 访问?
问题描述 Azure App Service创建后,默认会有一个 Azure App Service创建后,默认会有一个 https://xxxxxxxxxxxxx.chinacloudsites. ...
- 从实测出发,掌握 NebulaGraph Exchange 性能最大化的秘密
自从开发完 NebulaGraph Exchange,混迹在各个 NebulaGraph 微信群的我经常会看到一类提问是:NebulaGraph Exchange 的性能如何?哪些参数调整下可以有更好 ...
- 【Filament】基于物理的光照(PBR)
1 前言 自定义Blinn Phong光照模型中实现了基础的自定义光照,与现实的光照还是有些差别,本文将实现更逼真的光照效果,即基于物理的光照(PBR). 读者如果对 Filament 不太熟 ...
- C++socket中select函数
文章参考 https://www.cnblogs.com/shmilxu/p/4835873.html
- C++一些新的特性的理解
一.智能指针 为什么需要智能指针? 智能指针主要解决一下问题: 内存泄漏:内存手动释放,使用智能指针可以自动释放 共享所有权的指针的传播和释放,比如多线程使用同一个对象时析构的问题. C++里面的四个 ...
- 使用gitee
git全局设置 git config --global user.name "张xx" git config --global user.email "xxx@qq.co ...