为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM Database Server 64 V8
【操作系统】:windows10
【CPU】:20个核心
【问题描述】*:执行下面的sql需要4分钟,有没有什么优化的方法
update “GAMS_ARASSETCHECK2021_I” “i”
set “ZMLEIJZJ” =
(select coalesce(sum(“c”.“ZHEJJE”), 0) “leijzj”
from “GAMS_ASSETDEPRECDETAIL” “c”
where “c”.“ORGUNIT” = “i”.“ORGUNIT” and
“c”.“CARDOBJECTID” = “i”.“CARDOBJECTID”
and “c”.“JIZQJ” <= ‘202112’)
where “i”.“MRECID” = 0xC1F36A1AB0039080A91C23E82DA4EB49
and coalesce(“i”.“ZMJIAZ”, 0) > 0
and not exists
(select 1 “c0”
from “GAMS_ASSETCARD” “card”
where “card”.“YEWXLH” = 1
and “card”.“OBJECTID” = “i”.“CARDOBJECTID”
and “card”.“ZHEJZTID” = 0x36B91BD2800000412979CFB54DAD14D3
and “card”.“QUDFSID” in
(0x36B91A2620000021843A413C3B72743E,
0x36B91A26200000410F2A2C1C4B7929D5))
执行计划:
1 #UPDATE : [0, 0, 0]; table(GAMS_ARASSETCHECK2021_I), type(select), mpp_opt(0), hp_opt(0)
2 #PIPE2: [5111, 1682, 182]
3 #PRJT2: [60, 1682, 182]; exp_num(2), is_atom(FALSE)
4 #INDEX JOIN SEMI JOIN2: [60, 1682, 182]; (ANTI), join condition((card.ZHEJZTID = lit34 AND card.QUDFSID IN LIST))
5 #SLCT2: [41, 1691, 182]; exp_bool_case > var2
6 #BLKUP2: [41, 33839, 182]; 925FA0B99590DFE7(i)
7 #SSEK2: [41, 33839, 182]; scan_type(ASC), 925FA0B99590DFE7(GAMS_ARASSETCHECK2021_I as i), scan_range[lit34,lit34]
8 #BLKUP2: [11, 2, 0]; 4C7025CAF550ABF2(card)
9 #SSEK2: [11, 2, 0]; scan_type(ASC), 4C7025CAF550ABF2(GAMS_ASSETCARD as card), scan_range[(i.CARDOBJECTID,exp_cast(1),min,min,min),(i.CARDOBJECTID,exp_cast(1),max,max,max))
10 #SPL2: [5050, 84, 182]; key_num(2), spool_num(0), is_atom(FALSE), has_variable(0)
11 #PRJT2: [5050, 84, 182]; exp_num(3), is_atom(FALSE)
12 #HAGR2: [5050, 84, 182]; grp_num(1), sfun_num(3); slave_empty(0) keys(i.ROWID)
13 #INDEX JOIN LEFT JOIN2: [79, 288151, 182] ret_null(0)
14 #SLCT2: [60, 84, 182]; (i.MRECID = lit34 AND exp_bool_case > var3)
15 #INDEX JOIN SEMI JOIN2: [60, 1682, 182]; (ANTI), join condition((card.ZHEJZTID = lit34 AND card.QUDFSID IN LIST))
16 #SLCT2: [41, 1691, 182]; exp_bool_case > var4
17 #BLKUP2: [41, 33839, 182]; 925FA0B99590DFE7(i)
18 #SSEK2: [41, 33839, 182]; scan_type(ASC), 925FA0B99590DFE7(GAMS_ARASSETCHECK2021_I as i), scan_range[lit34,lit34]
19 #BLKUP2: [11, 2, 0]; 4C7025CAF550ABF2(card)
20 #SSEK2: [11, 2, 0]; scan_type(ASC), 4C7025CAF550ABF2(GAMS_ASSETCARD as card), scan_range[(i.CARDOBJECTID,exp_cast(1),min,min,min),(i.CARDOBJECTID,exp_cast(1),max,max,max))
21 #SSEK2: [3, 1, 0]; scan_type(ASC), GAMS_ASSETDEPRECDETAIL_5(GAMS_ASSETDEPRECDETAIL as c), scan_range[(i.ORGUNIT,i.CARDOBJECTID,null2,min,min),(i.ORGUNIT,i.CARDOBJECTID,‘202112’,max,max))
涉及到的表:
GAMS_ASSETCARD 4000多万数据
GAMS_ASSETDEPRECDETAIL 1.8亿数据
GAMS_ARASSETCHECK2021_I 135万数据
计划的第7行和第18行的估算行数,可以看出"i".“MRECID"没有统计信息,请先收集该列的统计信息,修正估算
STAT 100 ON GAMS_ARASSETCHECK2021_I(MRECID);
如果i表过滤后结果集很小,那么与card做index join时需要将"card”."OBJECTID"作为组合索引的前导列,
create index idx_GAMS_ASSETCARD_3colsid on GAMS_ASSETCARD(OBJECTID,ZHEJZTID,QUDFSID);
以上执行后再看执行计划如何
update /*+ MULTI_UPD_OPT_FLAG(1) */ “GAMS_ARASSETCHECK2021_I” “i” …
加个hint试试