为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8.1.3.140 pack4
【问题描述】*:执行了几分钟还没结束,请教如何优化
SELECT count(1) child_num,
count(CASE WHEN s.vacc_cert_no='0' then 1 END) child_not_apply_num
FROM chi c,CHILDS s,DEPA d
where c.CHIL_ID = s.CHIL_ID
and c.CHIL_CURDEPARTMENT=d.DEPA_ID
AND d.DEPA_USE='1'
and d.DEPA_LEVEL in ('1','2','3','4')
and c.CHIL_BIRTHDAY>=TO_DATE('19450101','yyyymmdd')
and c.CHIL_BIRTHDAY<=TO_DATE('20260323','yyyymmdd')
and c.CHIL_HERE not in ('4','5')
and d.AREA_COUNTY = 666;
执行计划:
1 #NSET2: [18117, 1, 391]
2 #PRJT2: [18117, 1, 391]; exp_num(2), is_atom(FALSE)
3 #AAGR2: [18117, 1, 391]; grp_num(0), sfun_num(2), distinct_flag[0,0]; slave_empty(0)
4 #PRJT2: [18117, 433213, 391]; exp_num(1), is_atom(FALSE)
5 #HASH2 INNER JOIN: [18117, 433213, 391]; RKEY_UNIQUE KEY_NUM(1); KEY(C.CHIL_ID=S.CHIL_ID) KEY_NULL_EQU(0)
6 #NEST LOOP INDEX JOIN2: [7689, 433213, 313]
7 #HASH RIGHT SEMI JOIN2: [3, 31, 174]; n_keys(1) KEY(DMTEMPVIEW_890995593.colname=D.DEPA_LEVEL) KEY_NULL_EQU(0)
8 #CONST VALUE LIST: [1, 4, 48]; row_num(4), col_num(1)
9 #SLCT2: [2, 35, 174]; (D.DEPA_USE = '1' AND D.AREA_COUNTY = var4)
10 #CSCN2: [2, 17187, 174]; INDEX33568141(DEPA as D); btr_scan(1)
11 #PARALLEL: [1850, 13735, 139]; scan_type(GE_LE,FULL), key_num(0, 1, 1), simple(0)
12 #HASH RIGHT SEMI JOIN2: [1850, 13735, 139]; n_keys(1) (ANTI), KEY(DMTEMPVIEW_890995594.colname=C.CHIL_HERE) KEY_NULL_EQU(0)
13 #CONST VALUE LIST: [1, 2, 48]; row_num(2), col_num(1)
14 #SLCT2: [1850, 13735, 139]; (C.CHIL_BIRTHDAY >= var5 AND C.CHIL_BIRTHDAY <= var6)
15 #BLKUP2: [1850, 13735, 48]; IDX$$_042F0001(C)
16 #SSEK2: [1850, 13735, 48]; scan_type(ASC), IDX$$_042F0001(CHI as C), scan_range[(D.DEPA_ID,min),(D.DEPA_ID,max))
17 #CSCN2: [6437, 53251289, 78]; INDEX34016583(CHILDS as S); btr_scan(1)
1、收集统计信息:
DBMS_STATS.GATHER_TABLE_STATS('模式名', '表名',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
2、检查CHILDSYMPTOM表上CHIL_ID列是否有索引
1、你这个是count计算,数据库cpu够不够,这个sql的并发高不高,不考虑cpu瓶颈的话,加上/+parallel(8)/ 加快计算效率;
2、另外执行计划最后一行明显没走索引,可以要添加索引
CREATE INDEX idx_chi_birthday_dept ON chi(CHIL_BIRTHDAY, CHIL_CURDEPARTMENT);
CREATE INDEX idx_depa_status_area ON DEPA(DEPA_USE, AREA_COUNTY, DEPA_ID);
CREATE INDEX idx_childs_id_cert ON CHILDS(CHIL_ID, vacc_cert_no);
3、如果索引已经添加或者索引添加后不生效,依旧执行慢,可以进行sql改写,应用老师验证下查询结果是否一致
SELECT
COUNT(1) AS child_num,
COUNT(CASE WHEN s.vacc_cert_no = '0' THEN 1 END) AS child_not_apply_num
FROM chi c
JOIN DEPA d ON c.CHIL_CURDEPARTMENT = d.DEPA_ID
JOIN CHILDS s ON c.CHIL_ID = s.CHIL_ID
WHERE d.DEPA_USE = '1'
AND d.AREA_COUNTY = 666
AND d.DEPA_LEVEL IN ('1','2','3','4')
AND c.CHIL_BIRTHDAY >= TO_DATE('19450101','yyyymmdd')
AND c.CHIL_BIRTHDAY <= TO_DATE('20260323','yyyymmdd')
AND c.CHIL_HERE NOT IN ('4','5');

执行计划可以截个图或者用代码块的方式上传上来么