微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多个子集的查询优化

如何解决多个子集的查询优化

我有一个“人员基本信息表”,并且将由许多“人员子集表”引用(这些子表之间没有关系,它们只是人员基本信息的子集)。 现在需要根据人员的外键将“人员子集”合并为一列,并将其显示为“人员基本信息”的字段(合并“人员子集”后,每个人员记录将仅显示一排)。

并将基本人员信息和人员子集信息传递到查询条件中,因此这些条件是动态组合的。

现在已经实现了,但是问题是查询需要优化。执行一次会特别慢。

数据库是oracle 11g。

这是某个查询生成sql

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

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?