如何解决多个子集的查询优化
我有一个“人员基本信息表”,并且将由许多“人员子集表”引用(这些子表之间没有关系,它们只是人员基本信息的子集)。 现在需要根据人员的外键将“人员子集”合并为一列,并将其显示为“人员基本信息”的字段(合并“人员子集”后,每个人员记录将仅显示一排)。
并将基本人员信息和人员子集信息传递到查询条件中,因此这些条件是动态组合的。
现在已经实现了,但是问题是查询需要优化。执行一次会特别慢。
数据库是oracle 11g。
WITH in_hr_work_party_current AS (
SELECT
*
FROM
hr_work_party
WHERE
status = '1'
AND removaltime IS NULL
AND (
appointorg IS NOT NULL
OR NAME IS NOT NULL
)
),qv_hr_work_party_current AS (
SELECT
empid,listagg (
DECODE (
appointorg,NULL,'','oidstart' || appointorg || 'oidend-'
) || NVL (NAME,'xx'),','
) WITHIN GROUP (
ORDER BY
positiongrade ASC,positionorder ASC,appointtime ASC
) AS party_current_info
FROM
in_hr_work_party_current
GROUP BY
empid
),in_position_postwork_main AS (
SELECT
po.empid,working_coid_name AS post_main_coid_name,working_poid_name AS post_main_poid_name,officedepname AS post_main_officedepname,post AS post_main_post,posttype AS post_main_posttype,workprof AS post_main_workprof,starttime AS post_main_starttime,FLOOR (
CEIL (
MONTHS_BETWEEN (
NVL (
TO_DATE (po.endtime,'yyyy-MM-dd'),SYSDATE
),TO_DATE (po.starttime,'yyyy-MM-dd')
)
) / 12
) || 'xx' AS post_main_years,epo.entrytime AS post_main_entrytime,ROW_NUMBER () OVER (
PARTITION BY po.empid
ORDER BY
po.opttime DESC
) AS rn
FROM
hr_work_postworkinfo po,hr_work_empposition epo,v_waf_ac_organ_base dep
WHERE
DEP.OID = PO.officedepid
AND epo.wepid = po.wepid
AND po.status = '1'
AND po.officetype = '00'
AND is_date (po.starttime) = 1
AND (
is_date (po.endtime) = 1
OR po.endtime IS NULL
)
AND epo.empsort = '01'
AND epo.subrelation = '01'
AND dep.orule LIKE '-xxxxx-%'
),qv_position_postwork_main AS (
SELECT
*
FROM
in_position_postwork_main
WHERE
rn = 1
),in_postworkinfo AS (
SELECT
po.*,epo.entrytime,epo.leavetime,epo.empsort,epo.empstatus,epo.subrelation,(
working_coid_name || DECODE (
working_poid_name,'-' || working_poid_name
) || DECODE (
officedepname,'-' || officedepname
)
) orgname,'yyyy-MM-dd')
)
) / 12
) postyear,MOD (
CEIL (
MONTHS_BETWEEN (
NVL (
TO_DATE (po.endtime,'yyyy-MM-dd')
)
),12
) postmonth,ROW_NUMBER () OVER (
PARTITION BY po.empid
ORDER BY
po.starttime DESC
) rn,COUNT (*) OVER (PARTITION BY po.empid) ct
FROM
hr_work_postworkinfo po,HR_WORK_EMPPOSITION EPO,V_WAF_AC_ORGAN_BASE DEP
WHERE
po.wepid = EPO.wepid
AND PO.officedepid = DEP.OID
AND is_date (starttime) = 1
AND (
is_date (endtime) = 1
OR endtime IS NULL
)
AND epo.empstatus != '05'
AND DEP.orule LIKE '-xxxxxx-%'
),qv_hr_position_postwork AS (
SELECT
empid,listagg (
'[' || starttime || 'xx' || NVL (endtime,'xx') || 'xx' || orgname || 'xx' || NVL (post,'xx') || 'xx' || NVL (posttype,'xx') || 'xx' || DECODE (
postyear,postyear || 'xx'
) || DECODE (
postmonth,postmonth || 'xxxx'
) || 'xx' || NVL (postgradation,'xx') || 'xxxx' || entrytime || 'xx' || empsort || 'xx' || empstatus || 'xx' || subrelation || ']','
) WITHIN GROUP (
ORDER BY
starttime DESC
) || (
CASE WHEN ct >= 5 THEN ',...' ELSE '' END
) work_info
FROM
in_postworkinfo
WHERE
rn <= 5
GROUP BY
empid,ct
),in_hr_emp_basicinfo AS (
SELECT
emp.*
FROM
hr_emp_basicinfo emp
),qv_hr_emp_basicinfo_view AS (
SELECT
in_hr_emp_basicinfo.*
FROM
in_hr_emp_basicinfo
),in_party AS (
SELECT
hr_work_party.NAME,hr_work_party.empid,hr_work_party.appointno,hr_work_party.appointtime,hr_work_party.removaltime,hr_work_party.positiongrade,NVL (
waf_ac_organ.NAME,hr_work_party.appointorg
) apporg,ROW_NUMBER () OVER (
PARTITION BY hr_work_party.empid
ORDER BY
appointtime DESC,removaltime DESC,positiongrade ASC,positionorder ASC
) rn,COUNT (*) OVER (PARTITION BY hr_work_party.empid) ct
FROM
hr_work_party,waf_ac_organ
WHERE
hr_work_party.status = '1'
AND hr_work_party.appointorg = waf_ac_organ.OID (+)
AND (
hr_work_party.appointorg IS NOT NULL
OR hr_work_party.NAME IS NOT NULL
)
),qv_hr_work_party AS (
SELECT
empid,listagg (
'[' || appointtime || 'xx' || NVL (removaltime,'xx') || ' ' || apporg || '-' || NVL (NAME,'xx') || DECODE (
NVL (appointno,'xx',' - ' || appointno
) || ']','
) WITHIN GROUP (
ORDER BY
rn ASC
) || (
CASE WHEN ct > 10 THEN ',...' ELSE '' END
) app_party,'xx') || DECODE (
positiongrade,'(' || positiongrade || ')'
) || ']',...' ELSE '' END
) AS party_grade
FROM
in_party
WHERE
rn <= 10
GROUP BY
empid,ct
)
SELECT
*
FROM
(
SELECT
dumb_table.*,ROWNUM dumb_rn
FROM
(
SELECT
qv_hr_work_party_current.party_current_info,qv_position_postwork_main.post_main_coid_name,qv_position_postwork_main.post_main_poid_name,qv_position_postwork_main.post_main_officedepname,qv_position_postwork_main.post_main_years,qv_hr_emp_basicinfo_view.age,qv_hr_emp_basicinfo_view.NAME,qv_hr_position_postwork.work_info
FROM
qv_hr_work_party_current,qv_position_postwork_main,qv_hr_work_party,qv_hr_position_postwork,qv_hr_emp_basicinfo_view
WHERE
1 = 1
AND qv_hr_emp_basicinfo_view.empid = qv_hr_work_party_current.empid(+)
AND qv_hr_emp_basicinfo_view.empid = qv_position_postwork_main.empid(+)
AND qv_hr_emp_basicinfo_view.empid = qv_hr_work_party.empid (+)
AND qv_hr_emp_basicinfo_view.empid = qv_hr_position_postwork.empid
AND qv_hr_emp_basicinfo_view.empid IS NOT NULL
ORDER BY
qv_hr_emp_basicinfo_view.sno
) dumb_table
)
WHERE
dumb_rn <= 30
AND dumb_rn > 0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。