为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM9
【操作系统】:CENTOS7
【CPU】: INTEL
【问题描述】*:
如下sql执行效率差, 在oracle中执行很快
SELECT
m.s_company_code AS companyCode,
d.n_period_code AS period,
m.s_contents_code AS contentsCode,
sum(NVL(d.N_TOTAL_VALUE_OPEN, 0)) AS totalValueOpen,
sum(NVL(d.n_total_value_close, 0)) AS totalValueClose
FROM
AM_MASTER_DATA m
LEFT JOIN AM_DEPRECIATION D ON
m.S_COMPANY_CODE = d.S_COMPANY_CODE
AND d.N_PERIOD_CODE IN ( 202301,202302 )
AND d.S_ASSETS_CODE = m.S_ASSETS_CODE
WHERE
m.s_company_code IN ( '2BJ1101030' , '2BJ1102030' , '2BJ1506070' )
AND ( m.S_CONTENTS_CODE LIKE '010301' || '%' )
AND d.S_ID IS NOT NULL
GROUP BY
m.s_company_code,
d.n_period_code,
m.s_contents_code
查看执行计划如下:
1 #NSET2: [1, 1, 378] 2 #PRJT2: [1, 1, 378]; exp_num(5), is_atom(FALSE) 3 #HAGR2: [1, 1, 378]; grp_num(3), sfun_num(2), distinct_flag[0,0]; slave_empty(0) keys(DMTEMPVIEW_889372821.TMPCOL0, DMTEMPVIEW_889372821.TMPCOL1, DMTEMPVIEW_889372821.TMPCOL2) 4 #PRJT2: [1, 22, 378]; exp_num(5), is_atom(FALSE) 5 #SLCT2: [1, 22, 378]; (D.N_PERIOD_CODE IN LIST AND D.S_COMPANY_CODE IN LIST) 6 #HASH2 INNER JOIN: [1, 22, 378]; KEY_NUM(2); KEY(M.S_COMPANY_CODE=D.S_COMPANY_CODE AND M.S_ASSETS_CODE=D.S_ASSETS_CODE) KEY_NULL_EQU(0, 0) 7 #SLCT2: [1, 22, 378]; D.S_ASSETS_CODE = M.S_ASSETS_CODE 8 #NEST LOOP INDEX JOIN2: [1, 22, 378] 9 #ACTRL: [1, 22, 378]; 10 #NEST LOOP INDEX JOIN2: [1, 11, 144] 11 #CONST VALUE LIST: [1, 3, 48]; row_num(3), col_num(1) 12 #BLKUP2: [1, 3, 144]; AM_MASTER_DATA_S_COMPANY_CODE_IDX(M) 13 #SSEK2: [1, 3, 144]; scan_type(ASC), AM_MASTER_DATA_S_COMPANY_CODE_IDX(AM_MASTER_DATA as M), scan_range[(DMTEMPVIEW_889372823.colname,'010301'),(DMTEMPVIEW_889372823.colname,'010302')) 14 #BLKUP2: [1, 2, 126]; INDEX33627091(D) 15 #SLCT2: [1, 2, 126]; (D.N_PERIOD_CODE IN LIST AND D.S_COMPANY_CODE IN LIST) 16 #SSEK2: [1, 2, 126]; scan_type(ASC), INDEX33627091(AM_DEPRECIATION as D), scan_range[(M.S_COMPANY_CODE,min,min),(M.S_COMPANY_CODE,max,max)) 17 #CSCN2: [778, 5095517, 234]; INDEX33627003(AM_DEPRECIATION as D); btr_scan(1)
我发现第17行描述的计划中, 对AM_DEPRECIATION表做了全表扫描,且成本很高, 不知道为啥要在left join后又进行了高成本的hash join,
请问如何优化?
我还发现inner join的执行效率都很差. 有什么系统参数需要调整吗? 请给出建议!,万分感谢
执行一下下面的sql,然后看一下执行计划
SELECT /+enable_hash_join(0)/
m.s_company_code AS companyCode,
d.n_period_code AS period,
m.s_contents_code AS contentsCode,
sum(NVL(d.N_TOTAL_VALUE_OPEN, 0)) AS totalValueOpen,
sum(NVL(d.n_total_value_close, 0)) AS totalValueClose
FROM
AM_MASTER_DATA m
LEFT JOIN AM_DEPRECIATION D ON
m.S_COMPANY_CODE = d.S_COMPANY_CODE
AND d.N_PERIOD_CODE IN ( 202301,202302 )
AND d.S_ASSETS_CODE = m.S_ASSETS_CODE
WHERE
m.s_company_code IN ( '2BJ1101030' , '2BJ1102030' , '2BJ1506070' )
AND ( m.S_CONTENTS_CODE LIKE '010301' || '%' )
AND d.S_ID IS NOT NULL
GROUP BY
m.s_company_code,
d.n_period_code,
m.s_contents_code
先关闭自适应计划,/*+ ADAPTIVE_NPLN_FLAG(0) */
您试着先收集一下涉及到的表的统计信息,再看看计划是否有改变呢,看计划里的代价好多都是1,感觉是统计信息现在没有收集完全