简单sql优化案例

最近在做集团任务中心视图的优化  发现几个系统的sql视图慢的过分  直接po代码  核心的业务sql 已蒙蔽

create or replace view km_todotasklist as
select "ID","DEVICE_TYPE","SYSTEM_TYPE","TASK_CODE","TASK_TYPE1","TASK_TYPE2","TITLE","STATUS","OWNER_ID","OWNER_NAME","PRIORITY","CREATE_ID","CREATE_TIME","UPDATE_ID","UPDATE_TIME" from (
select    t.id_ as id,
  CASE
         WHEN (select t.cfg_value from SYS_OT_CONFIG t where t.code ='SERVER_H5_MODELID'  and   INSTR( t.cfg_value ,a.module_id)>0   ) is null  THEN
          'PC,APP'
         WHEN (select t.cfg_value from SYS_OT_CONFIG t where t.code ='SERVER_H5_MODELID'  and  INSTR( t.cfg_value ,a.module_id)>0    ) is not  null THEN
          'PC'
         ELSE
         (select t.cfg_value from SYS_OT_CONFIG t where t.code ='SERVER_H5_MODELID'  and  INSTR( t.cfg_value ,a.module_id)>0   )
       END as device_type,
       'KM' as system_type,
       '核心业务URL’||utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw((select to_char(t.next_user_id_)
          from OA_OT_PROCESS_RECORD t
         where t.next_task_id_ = t.id_ and rownum=1))))  as task_code,
       '代办' as task_type1,
       to_char(mo.name)  as task_type2,
        to_char(a.title) as title,
       '0' as status,
       (select to_char(t.next_user_id_)
          from OA_OT_PROCESS_RECORD t
         where t.next_task_id_ = t.id_ and rownum=1) as owner_id,
       (select em.real_name
          from IMS_OT_USER t
         inner join IMS_OT_EMPLOYEE em
            on t.employee_id = em.id
         where t.user_login_name =
               (select t.next_user_id_
                  from OA_OT_PROCESS_RECORD t
                 where t.next_task_id_ = t.id_ and rownum=1) and rownum=1) as owner_name,
       '' as priority,
       a.creator as create_id,
       a.create_time as create_time,
       '' as update_id,
       '' as update_time
  from oa_ot_application a
 inner join act_ru_task t
    on t.proc_inst_id_ = a.pro_inst_id  and   t.task_def_key_ <> 'usertask2'
 inner join oa_ot_application_ext et
    on et.app_id = a.id and et.business_type ='1'
 inner join   OA_OT_APP_MODULE  mo on a.module_id =mo.id
UNION ALL
select    t.id as id,
       'PC' as device_type,
       'KM' as system_type,
        'http://10.88.158.62'||(select  t.oa_req_url   from OA_OT_APP_MODULE t where   t.id  =a.module_id)||'/input.htm?taskId='||t.id||'&appId='||a.id||'&sid='|| utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(to_char(t.user_id))))  as task_code,
       '待阅' as task_type1,
        to_char(mo.name)  as task_type2,
       to_char(a.title) as title,
       '0' as status,
       to_char(t.user_id)  as owner_id,
       (select em.real_name
          from IMS_OT_USER t
         inner join IMS_OT_EMPLOYEE em
            on t.employee_id = em.id
         where t.user_login_name = t.user_id  and rownum=1) as owner_name,
       '' as priority,
       a.creator as create_id,
       a.create_time as create_time,
       '' as update_id,
       '' as update_time
  from oa_ot_application a
 inner join oa_ru_circulation t
    on t.proc_inst_id = a.pro_inst_id
 inner join oa_ot_application_ext et
    on et.app_id = a.id
    inner join   OA_OT_APP_MODULE  mo on a.module_id =mo.id
  ) t  order by t.create_time desc;

全局查询大概15秒左右。


1 了解核心业务需求

2 了解目前sql痛点

3 改进sql

create or replace view km_todotasklist as
select    t.id_ as id,
  CASE
         WHEN (select t.cfg_value from SYS_OT_CONFIG t where t.code ='SERVER_H5_MODELID'  and   INSTR( t.cfg_value ,a.module_id)>0   ) is null  THEN
          'PC,APP'
         WHEN (select t.cfg_value from SYS_OT_CONFIG t where t.code ='SERVER_H5_MODELID'  and  INSTR( t.cfg_value ,a.module_id)>0    ) is not  null THEN
          'PC'
         ELSE
         (select t.cfg_value from SYS_OT_CONFIG t where t.code ='SERVER_H5_MODELID'  and  INSTR( t.cfg_value ,a.module_id)>0   )
       END as device_type,
       'KM' as system_type,
       '核心业务URL'||utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(re.next_user_id_)))  as task_code,
       '代办' as task_type1,
       to_char(mo.name)  as task_type2,
        to_char(a.title) as title,
       '0' as status,
      re.next_user_id_ as owner_id,
      emp.real_name as owner_name,
       '' as priority,
       a.creator as create_id,
       a.create_time as create_time,
       '' as update_id,
       '' as update_time
  from oa_ot_application a
 inner join act_ru_task t
    on t.proc_inst_id_ = a.pro_inst_id
 inner join oa_ot_application_ext et
    on et.app_id = a.id and et.business_type ='1'
 inner join   OA_OT_APP_MODULE  mo on a.module_id =mo.id
 left join   OA_OT_PROCESS_RECORD re  on re.next_task_id_ = t.id_
 left join IMS_OT_USER uss  on re.next_user_id_ =uss.user_login_name 
 left join IMS_OT_EMPLOYEE emp on uss.employee_id= emp.id;


 
 目前sql已优化到0.3秒



文章来源:

Author:芸诺
link:http://yuuuo.com/?id=50