复杂SQL优化

 

SQL:

 select *
           from (select  distinct action_Type_Name as actionName,
                                 toRZ,
                                 custName,
                                 partyTypeCd,
                                 t.ol_nbr,
                                 channelName,
                                 staffName,
                                 soDate,
                                 ct.status,
                                 ct.status as stName,
                                 t.staff_number,
                                 t.region_id,
                                 t.region_name as areaName,
                                 t.access_number,
                                 '0' as wzType,
                                 '' deal,
                                 '' checkLog,
                                 '' hzPdf,
                                 '' cut,
                                 '' olNbrLink,
                                 pdf_type,
                                 '' pdfZg,
                                 case
                                   when e.attr_value_name is null then
                                    t.SYSTEM_SOURCE
                                   else
                                    e.attr_value_name
                                 end system_source,
                                 d.source_name as sourceName,
                                 t.sd_staff as sdStaff,
                                 t.sd_staff_name as sdStaffName 
                   from YWJH.checkwz_scene t
                   left join YWJH.check_wz_zg_status ct
                     on t.ol_nbr = ct.ol_nbr
                   left join YWJH.checkwz_source d
                     on d.source_order = t.order_source
                   left join YWJH.sys_source_desc e
                     on e.attr_value = t.SYSTEM_SOURCE
                  where 1 = 1
                    AND (EXISTS (select 1
                                   from YWJH.V_CHANNEL_BSS_staff_nj sto
                                  where sto.staff_code = 'WTXF002'
                                    and sto.org_id = t.channel_id) or
                         (t.sd_staff = 'WTXF002') or
                         (t.staff_number = 'WTXF002'))
                    and ct.status in ('F', 'RF', 'WC')
                    and t.city_id = '20'
                     union
                   select distinct action_Type_Name as actionName,
                                   toRZ,
                                   custName,
                                   partyTypeCd,
                                   t.ol_nbr,
                                   channelName,
                                   staffName,
                                   soDate,
                                   ct.status,
                                   ct.status as stName,
                                   t.staff_number,
                                   t.region_id,
                                   t.region_name as areaName,
                                   t.access_number,
                                   '1' as wzType,
                                   '' deal,
                                   '' checkLog,
                                   '' hzPdf,
                                   '' cut,
                                   '' olNbrLink,
                                   pdf_type,
                                   '' pdfZg,
                                   '' system_source,
                                   '' sourceName,
                                   '' sdStaff,
                                   '' sdStaffName
                           from YWJH.checkwz_scene_wz_old t
                           left join YWJH.check_wz_zg_status ct
                             on t.ol_nbr = ct.ol_nbr
                          where 1 = 1
                            AND (EXISTS (select 1
                                           from YWJH.V_CHANNEL_BSS_staff_nj sto
                                          where sto.staff_code = 'WTXF002'
                                            and sto.org_id = t.channel_id) or
                                 (t.staff_number = 'WTXF002'))
                            and ct.status in ('F', 'RF', 'WC')
                            and t.city_id = '20'
                 ) aa
          order by aa.ol_nbr desc ;

执行计划:

瞄了几眼,这个SQL如果不该写无法优化。

信不信由你,性能问题在 ID 14,20.  

改写后的SQL:

select *
           from (select  distinct action_Type_Name as actionName,
                                 toRZ,
                                 custName,
                                 partyTypeCd,
                                 t.ol_nbr,
                                 channelName,
                                 staffName,
                                 soDate,
                                 ct.status,
                                 ct.status as stName,
                                 t.staff_number,
                                 t.region_id,
                                 t.region_name as areaName,
                                 t.access_number,
                                 '0' as wzType,
                                 '' deal,
                                 '' checkLog,
                                 '' hzPdf,
                                 '' cut,
                                 '' olNbrLink,
                                 pdf_type,
                                 '' pdfZg,
                                 case
                                   when e.attr_value_name is null then
                                    t.SYSTEM_SOURCE
                                   else
                                    e.attr_value_name
                                 end system_source,
                                 d.source_name as sourceName,
                                 t.sd_staff as sdStaff,
                                 t.sd_staff_name as sdStaffName 
                   from YWJH.checkwz_scene t
                   left join YWJH.check_wz_zg_status ct
                     on t.ol_nbr = ct.ol_nbr
                   left join YWJH.checkwz_source d
                     on d.source_order = t.order_source
                   left join YWJH.sys_source_desc e
                     on e.attr_value = t.SYSTEM_SOURCE
                    left join  YWJH.V_CHANNEL_BSS_staff_nj sto  on  sto.staff_code = 'WTXF002'   and sto.org_id = t.channel_id
                  where 1 = 1 
                   and (sto.staff_id is not null or  t.sd_staff = 'WTXF002'or t.staff_number = 'WTXF002')
                    and ct.status in ('F', 'RF', 'WC')
                    and t.city_id = '20'
                     union
                   select distinct action_Type_Name as actionName,
                                   toRZ,
                                   custName,
                                   partyTypeCd,
                                   t.ol_nbr,
                                   channelName,
                                   staffName,
                                   soDate,
                                   ct.status,
                                   ct.status as stName,
                                   t.staff_number,
                                   t.region_id,
                                   t.region_name as areaName,
                                   t.access_number,
                                   '1' as wzType,
                                   '' deal,
                                   '' checkLog,
                                   '' hzPdf,
                                   '' cut,
                                   '' olNbrLink,
                                   pdf_type,
                                   '' pdfZg,
                                   '' system_source,
                                   '' sourceName,
                                   '' sdStaff,
                                   '' sdStaffName
                           from YWJH.checkwz_scene_wz_old t
                           left join YWJH.check_wz_zg_status ct   on t.ol_nbr = ct.ol_nbr
                           left join  YWJH.V_CHANNEL_BSS_staff_nj sto  on  sto.staff_code = 'WTXF002'   and sto.org_id = t.channel_id
                          where 1 = 1 
                            and ( sto.staff_id is not null or t.staff_number = 'WTXF002')
                            and ct.status in ('F', 'RF', 'WC')
                            and t.city_id = '20'
                 ) aa
          order by aa.ol_nbr desc ;

效率对比

优化前:125S, 2分钟左右

优化后:13S

信不信由你,该SQL优化后, 业务高峰期业务量增加近2倍,CPU压力减少 50%左右。

补一个后记吧。

本身该SQL优化不难, 只是对该项目有里程碑意义。 本身业务量就大,业务性能提升不上来, 需要整体优化,但并不是很难,本次优化基本上一眼定位到系统瓶颈。 之前写博客纪念了一个SQl, 也是简单看两眼,从1997S优化到 0.2S。那次 个例上面看意义很大,这次对整体意义更大。 从接手优化这个系统,到定位到问题,再到解决问题。几乎是很快的。所以这次也该纪念下。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值