oracle用了to_char() 函数之后导致的慢sql
2、当执行带条件只带 and to_char( oofw.finish_date,‘yyyy-MM-dd’) =‘2023-05-13’时很慢,这里表中的每一行应用一个函数to_char()到 finish_date 列上,导致不能走索引。1、当执行带条件只带 and oofw.finish_date >= trunc(sysdate) 条件时查询很快。**oracle用了to_char() 函数
**oracle用了to_char() 函数之后导致的慢sql
(to_char( oofw.finish_date,‘yyyy-MM-dd’)= ‘2023-05-13’) **
select
count(t.pre_score)/count(*) znzwzqpfl,
count(t.score)/count(*) znzwzhpfl,
sum(case
when t.pre_design_step is null and t.design_step is null then 0
else 1
end)/count(*) znzwydbsjcl,
sum(case
when t.three_platform_rate is null and t.soft_probe_rate is null then 0
else 1
end)/count(*) zjhdsljcl,
count(t.iq_man_ex_result)/count(*) gdtpzjl,
t.citycode,
t.countycode,
t.cityname,
t.countyname,
t.staffid,
t.staffname,
t.year,
t.month,
t.yearandmonth
from(
select
oofw.party_name as staffname,
sta.staff_id as staffid,
to_char(oofw.finish_date, 'yyyy' )as year,
to_char(oofw.finish_date, 'MM' )as month,
to_char(oofw.finish_date, 'yyyy-MM' )as yearandmonth,
county.area_id as countycode,
oofw.county as countyname,
oofw.user_area_id as citycode,
city.area_name as cityname,
zpi.pre_score,
zpi.score,
zpi.pre_design_step,
zpi.design_step,
oofw.three_platform_rate,
oofw.soft_probe_rate,
oofw.iq_man_ex_result
from bable_a oofw
join bable_b ogcor ON oofw.order_id = ogcor.order_id
join bable_c ogco ON ogcor.group_order_id = ogco.id
join bable_d zpi ON zpi.order_id = ogco.id
left join bable_e sta on sta.staff_name = oofw.party_name
left join bable_f city on city.area_id = oofw.user_area_id
left join bable_f county on county.area_name = oofw.county
where zpi.state=1
--and to_char( oofw.finish_date,'yyyy-MM-dd') = '2023-05-13'
and oofw.finish_date >= trunc(sysdate)
) t
group by t.citycode,t.countycode,t.cityname,t.countyname,t.staffid,t.staffname,t.year,t.month,t.yearandmonth
问题现象和解决方案
1、当执行带条件只带 and oofw.finish_date >= trunc(sysdate) 条件时查询很快。
2、当执行带条件只带 and to_char( oofw.finish_date,‘yyyy-MM-dd’) = ‘2023-05-13’ 时很慢,这里表中的每一行应用一个函数to_char()到 finish_date 列上,导致不能走索引。
3、优化:改成某天时间的范围查询
把and to_char( oofw.finish_date,‘yyyy-MM-dd’) = ‘2023-05-13’ 条件换成下面这样,避免finish_date字段使用to_char()函数
and oofw.finish_date >= to_date(‘2023-05-13 00:00:00’,‘yyyy-MM-dd HH24:mi:ss’)
and oofw.finish_date <= to_date(‘2023-05-13 23:59:59’,‘yyyy-MM-dd HH24:mi:ss’)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)