【DM版本】:DM Database Server x64 V8 (--03134284094-20231220-212751-20067 Pack22)
【问题描述】*:层次查询执行时间较长,CNNTB_OPT_FLAG参数值已经是193,执行计划显示的代价很小,但实际执行时间很长,想请教一下该语句如何优化能提高执行效率呢
SELECT
DECODE(newTable.SPECIALTYNAME, '', '未知', newTable.SPECIALTYNAME) SPECIALTYNAME,
count(*) AS countNum
FROM
(
select distinct
id,
regexp_substr(SPECIALTY_NAME, '[^,]+', 1, LEVEL) as SPECIALTYNAME
from
POLITICAL_RESEARCH.SRSP_EXPERT_INFO
where
status_code = '1' connect by LEVEL <= length(SPECIALTY_NAME) - length(regexp_replace(SPECIALTY_NAME, ',', '')) + 1
order by
id
) AS newTable
WHERE
1 = 1
GROUP BY
newTable.SPECIALTYNAME
如果 POLITICAL_RESEARCH.SRSP_EXPERT_INFO 表中 ID 字段不重复的话,你做个试验,看看下面这个SQL是否能稍快些
SELECT DECODE(newTable.SPECIALTYNAME, '', '未知', newTable.SPECIALTYNAME) SPECIALTYNAME
,count(*) AS countNum
FROM (select distinct --如果能确保同一个ID下,SPECIALTY_NAME拆分出的各段值不存在重复,可以去掉这个DISTINCT
id
,regexp_substr(SPECIALTY_NAME, '[^,]+', 1, LEVEL) as SPECIALTYNAME
from SRSP_EXPERT_INFO
where status_code = '1'
connect by LEVEL <= length(SPECIALTY_NAME) - length(regexp_replace(SPECIALTY_NAME, ',', '')) + 1
--增加下面两句条件
AND PRIOR SYS_GUID IS NOT NULL --避免递归出现循环
AND PRIOR ID = ID --只在同一个ID内部递归循环,避免跨ID
order by id
) AS newTable
WHERE 1 = 1
GROUP BY newTable.SPECIALTYNAME
可以使用et工具查看一下具体是哪一步耗时最多